在決定驗證代碼放置位置前,必須區分兩類驗證:
格式驗證錯誤通常直接回饋給用戶(重新輸入),追求最低處理開銷、最快回應。在採用業務委派模式的 EJB 架構中,委派類是 Web 層與 EJB 層的門面,放置格式驗證最自然:
public class LibraryDelegate implements ILibrary {
public boolean checkout(List books) throws ApplicationException {
// 格式驗證:確保列表元素皆為 Book
for (Iterator i = books.iterator(); i.hasNext(); ) {
Object obj = i.next();
if (!(obj instanceof Book)) {
throw new ApplicationException(VALIDATION_ERROR, "Only Books allowed");
}
}
return library.checkout(books); // 委派給 Session Bean
}
}
優勢:錯誤直接在委派層拋回 Web 層,避免 JNDI 查找、RMI 傳輸、Session Bean 進入等昂貴開銷。
業務驗證涉及多實體協作、資料庫查詢、事務邊界,若放在委派層:
最佳位置是 Session Bean 實作類(或領域模型):
| 層級 | 驗證類型 | 典型例子 | 錯誤處理 |
|---|---|---|---|
| Web / 委派層 | 格式驗證 | 必填欄位、型別、長度、正則 | 即時回饋用戶重輸 |
| EJB 業務層 | 業務規則驗證 | 庫存充足、信用額度、狀態機流轉 | 拋出應用異常,由委派層轉換給 Web |
「格式驗證前置,業務驗證後置」是經驗法則。利用委派模式天然的分層邊界,讓錯誤在最經濟的層級被攔截,讓業務邏輯在最高效的層級執行,是 EJB 應用驗證架構的核心智慧。