[英]JSF 2.1 + Spring + hibernate how to Implement correctly Exception handling?
我正在研究具有以下結構的項目:
DaoService - 是 Spring bean,它具有 SessionFactory object 並使用 Hibernate 對數據庫執行數據庫操作。 標有@Repository
幾個 BLogicService 服務- 是 Spring bean,它們具有自動裝配的 DaoService 並對 POJO 執行一些操作並將其保存在 Hibernate 中。 標有@Service
注釋。
JSF 2.1 托管 Bean - 使用 XHTML 頁面迭代並保存屬性和 JSF 操作。 標記為@ManagedBean
並從 Spring 接收 BlLogicServices 對象為@ManagedProperty
最后是訪問托管 bean 的 XHTML 頁面。
在此類應用程序中管理異常處理的正確方法是什么? 如果我在 DAO 級別有異常,將它轉換為 GUI 的正確方法是什么?
如果我使用的是 Spring MVC,我會使用`@ExceptionHandler,但是如何在 JSF 2.1 中使用 Spring 來完成?
要在 BL 處理期間為所有意外異常創建通用異常捕獲器,您可以實現 ExceptionHandlerFactory 並在 faces-config.xml 中指定它:
<factory>
<exception-handler-factory>
my.package.ExceptionHandlerFactory
</exception-handler-factory>
</factory>
它應該創建 ExceptionHandler 實現,該實現反過來實現處理方法,例如一個消耗異常(我想我已經從 JSF2 參考或類似來源獲取它):
private static class MyExceptionHandler extends ExceptionHandlerWrapper {
private ExceptionHandler parent;
public WfExceptionHandler(ExceptionHandler parent) {
this.parent = parent;
}
@Override
public ExceptionHandler getWrapped() {
return this.parent;
}
@Override
public void handle() throws FacesException {
for (Iterator<ExceptionQueuedEvent> i =
getUnhandledExceptionQueuedEvents().iterator();
i.hasNext();) {
ExceptionQueuedEvent event = i.next();
i.remove();
ExceptionQueuedEventContext context =
(ExceptionQueuedEventContext) event.getSource();
Throwable t = context.getException();
myProcessing(t);
}
}
...
}
myProcessing(t) 可以檢索將向您的 gui 控制台打印異常的托管 bean,或者您可以只使用 FacesContext.getCurrentInstance().addMessage()。 您還需要調用 FacesContext.getCurrentInstance().renderResponse() 來更新視圖,因為未處理的異常中止了 JSF 生命周期。
或者,您可以在所有托管 bean 方法中使用 try/catch 並在那里執行等效的 myProcessing(t)。 不同之處在於 ExceptionHandler 還會在頁面呈現期間捕獲異常,不一定由您的類生成。
不應將異常傳遞給 UI。
您使用 web MVC 層這一事實表明您有某種控制器來接受、驗證和綁定傳入請求; 選擇一個處理程序來滿足請求; package的反應,好壞; 並選擇下一個視圖。 異常需要返回到 controller,然后它將提供必要的信息並選擇錯誤視圖。
您問題的 rest 只是混淆了這個問題。 DAO、MDB 等 - 都需要由某種處理程序進行編組。 (JSF 仍然調用那些動作嗎?我從不使用它。)該處理程序應該捕獲任何異常並通過 controller 將它們傳達回 UI。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.