跳轉到內容

WebObjects/EOF/使用 EOF/驗證

來自華夏公益教科書

http://developer.apple.com/documentation/WebObjects/Enterprise_Objects/BusinessLogic/chapter_4_section_4.html

mmalcolm 的 StepWise 文章名為“使用 WebObjects 5 進行資料驗證”:http://www.stepwise.com/Articles/Technical/2001-06-13.01.html

Jerry W. Walker

[編輯 | 編輯原始碼]

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

[編輯 | 編輯原始碼]

問題:我想在 EO 驗證後但儲存到圖/資料庫之前對其進行更改。這可能嗎?

Chuck Hill

[編輯 | 編輯原始碼]

您不想這樣做,您不應該這樣做,而且框架會盡一切努力阻止您這樣做。validateForSave 是物件儲存的守門員。它的作用是確保只有透過驗證的物件才能儲存。在 validateForSave() 完成後修改物件圖將違反其存在的根本原因。

我認為您有三種選擇

  1. 在元件中執行
  2. 在 EO 中執行
  3. 在另一個物件中執行

我同意元件可能不是執行此操作的地方,我也不喜歡讓我的 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
 }
  • 我還有另一個想法,但它已經從我的腦海中消失了。 :-)
華夏公益教科書