WebObjects/EOF/使用 EOF/驗證
外觀
mmalcolm 的 StepWise 文章名為“使用 WebObjects 5 進行資料驗證”:http://www.stepwise.com/Articles/Technical/2001-06-13.01.html
WO 和 EOF 擁有令人難以置信的各種驗證機制。以下是一些您可能會發現有用的筆記
- 使用者介面
- 防止/阻止使用者輸入不適當的資料
- 格式化程式
- 格式化
- 只接受格式有效的資料
- 型別強制轉換
- 型別錯誤會引發異常
- 簡單驗證
- 引發異常並忽略值
- 必須與當前值不同或未分配
- WOComponent 的 validationFailedWithException(Throwable t, Object value, String keyPath)
- 當企業物件或格式化程式在賦值期間驗證失敗時呼叫。
- 預設實現忽略錯誤。
- 子類可以覆蓋以解決錯誤。
- 格式化
- 模型
- 屬性約束
- 檢查
- 允許空值
- 字串長度
- 數字精度
- 關係完整性
- 在去資料庫之前檢查這些
- 檢查
- 關係完整性約束
- 可選性
- 對於一對一和一對多
- 刪除規則
- 如果源被刪除,那麼如何處理
- 所有權,擁有物件為
- 如果關係斷開則刪除
- 如果關係新增則建立
- 刪除規則(如果使用者嘗試刪除關係源)
- 級聯 - 也刪除所有目標物件
- 使無效 - 使反向引用無效
- 拒絕 - 如果存在目標物件,則禁止刪除
- 無 - 刪除並忽略目標物件
- 可選性
- 屬性約束
- EO
- 屬性級(或鍵級)驗證
- 當值更改時呼叫
- 超類中的預設方法檢查基於模型的約束
- 可以覆蓋以進行自定義驗證
- 在 EO 的屬性更改之前呼叫
- 驗證方法在失敗時丟擲異常
- validateValueForKey("weight") 觸發:public <type> validateWeight(Object newWeight) throws NSValidation.ValidationException {
- 物件級驗證
- 當儲存插入/刪除/更新更改時呼叫
- public void validateForInsert() throws NSValidation.ValidationException
- public void validateForUpdate() throws NSValidation.ValidationException
- public void validateForDelete() throws NSValidation.ValidationException
- 以上所有在超類中預設呼叫
- public void validateForSave() throws NSValidation.ValidationException
- 超類的實現呼叫鍵級驗證
- 在 EO 的屬性更改之後呼叫
- 當儲存插入/刪除/更新更改時呼叫
- 驗證在以下情況下執行
- 表單值透過繫結推送到 EO 屬性中
- 在編輯上下文中儲存更改
- 以程式設計方式呼叫
- 屬性級(或鍵級)驗證
問題:我想在 EO 驗證後但儲存到圖/資料庫之前對其進行更改。這可能嗎?
您不想這樣做,您不應該這樣做,而且框架會盡一切努力阻止您這樣做。validateForSave 是物件儲存的守門員。它的作用是確保只有透過驗證的物件才能儲存。在 validateForSave() 完成後修改物件圖將違反其存在的根本原因。
我認為您有三種選擇
- 在元件中執行
- 在 EO 中執行
- 在另一個物件中執行
我同意元件可能不是執行此操作的地方,我也不喜歡讓我的 EO 呼叫 saveChanges()。您可能想考慮第三種選擇,即擁有某種 ShiftManager 物件來負責監督班次的關閉和開啟。它可以向頁面提供有關什麼有效以及有哪些選擇的資訊,並且它可以處理兩階段儲存。
在我那樣做之前,我會考慮其他一些選擇。以下是一些可能激發您自己想法的想法
- 將重置現金盒餘額推遲到下一班次開始之前。我上次當收銀員的時候(謝天謝地,很久以前了),就是這樣運作的。您交上您的現金托盤和差異說明,老闆搖搖頭,咕噥著。然後他記錄了所有資訊。對於下一個員工,他然後重新裝滿了現金抽屜。通常這要到第二天早上才會發生。
- 向 Shift 新增一個方法,如下所示
public void close() throws ValidationException {
validateForSave();
cashBox().resetBalance();
}
在您的元件中
try {
shift().close();
ec().saveChanges();
}
catch (ValidationException v) {
// do the right thing
}
catch (EOGeneralAdaptorException e) {
// do the right thing
}
- 我還有另一個想法,但它已經從我的腦海中消失了。 :-)