簡體   English   中英

JSF 2.1 + Spring + hibernate 如何正確實現異常處理?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM