2013-11-22 40 views
1

我想知道在中/大型Java EE應用程序中處理驗證錯誤的最佳方式是什麼。從JSF中的EJB處理驗證錯誤

假設我已經管理bean和facade,如下所示。

class SomeManagedBean { 

    @EJB 
    SomeFacade someFacade; 

    public void performSomeAction() { 
     (...) 
     someFacade.businessAction(loggedUser, editedEntity); 
     (...) 
    } 

} 

class SomeFacadeImpl { 

    public Object businessAction(User user, Entity entity) { 
     if (!isInCorrectStateToDoAction(entity)) { 
      // error A 
     } 
     (...) 
     if (!hasRightToDoAction(user, entity)) { 
      // error X 
     } 

     doAction(user, entity); 
    } 

} 

我期望businessAction從SomeFacade應該驗證它們的輸入並檢查它是否可以做定參數這項業務的行動。這是因爲我可能在應用程序中的幾個地方使用這種業務方法,我不想複製驗證代碼。

假設我想使用FacesMessage向客戶端提供有關驗證錯誤的信息。

一些解決方案:

  • 例外 - 當事情是錯的爭論,我只是拋出一個異常
    • ,所以我不得不放棄IncorrectStateForActionException,NoRightToDoActionException
    • 爲什麼不:我只能拋出一個異常所以我不能通知用戶幾件事情:「你沒有權利」,(...),「實體是不正確的狀態」
    • 旁邊的異常不應該用來提供我們的應用邏輯
  • 一些結果類

    class Result<T> { 
        T returnedValueFromMethod; 
    
        List<ProcessingError> errors; 
    } 
    
    • 現在我的業務方法的定義是這樣的:

      public Result<Object> businessAction(User user, Entity entity) 
      
    • 什麼是錯的我添加錯誤信息,結果

    • 當一切都很好我放返回值到我的結果對象並返回這個對象
    • 爲什麼不這樣:這看起來像一種非常複雜的結構「錯誤代碼」。由於該建議告訴「將錯誤代碼更改爲異常」,爲什麼我們想避免它,這是可以理解的。
  • 我們可以做驗證的門面和控制器
    • 爲什麼不:複製代碼
  • 驗證只在控制器和行動門面
    • 爲什麼不:它可能是危險的時候,我們從代碼中的其他地方使用此業務活動方法
  • 我們可以在外觀中執行兩種方法:從驗證的驗證和行動(查詢命令分離)
    • 結果應該包含可能因此會出現各種可能的錯誤這是很奇怪的結構
  • 我們能爲驗證幾種方法(錯誤,從A到X)
    • 可以很容易地提供錯誤消息
    • 但這種解決方案似乎只是愚蠢
  • 任何其他的想法?

什麼是最好的解決方案?

回答

0

在業務層進行認證/驗證,並讓它在發生故障時拋出異常。您可以在JSF操作方法中處理它。

E.g.

@EJB 
private SomeService service; 

public void someAction() { 
    try { 
     service.doSomething(); 
     addGlobalInfoFacesMessage("Doing something succeed!"); 
    } catch (SomeBusinessException e) { 
     addGlobalErrorFacesMessage("Doing something failed with {0}", e.getMessage()); 
    } 
} 

或者,你可以讓它去和容器由<error-page>處理它具體<exception-type>

至於全部由自己進行驗證和確認,在Java EE堆棧提供喜歡JAAS @RolesAllowed認證和JSR303 @NotNull@Size等註解模型。這應該減少服務方法本身內的if檢查樣板。

+0

恐怕這還不夠。 (1)正如我之前說過的:我想避免使用異常來控制程序流,(2)無論我使用JAAS(這太遲了)還是Java Bean驗證,都會有很多可能的,不同的錯誤方法在EJB中。我想通知用戶他們所有的,而不是這個,這將首先驗證 – zimi

+0

(3)至於錯誤頁面,我希望用戶留在他所在的頁面,併爲他提供糾正錯誤/錯誤的能力。 – zimi