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)
- 可以很容易地提供錯誤消息
- 但這種解決方案似乎只是愚蠢
- 任何其他的想法?
什麼是最好的解決方案?
恐怕這還不夠。 (1)正如我之前說過的:我想避免使用異常來控制程序流,(2)無論我使用JAAS(這太遲了)還是Java Bean驗證,都會有很多可能的,不同的錯誤方法在EJB中。我想通知用戶他們所有的,而不是這個,這將首先驗證 – zimi
(3)至於錯誤頁面,我希望用戶留在他所在的頁面,併爲他提供糾正錯誤/錯誤的能力。 – zimi