簡體   English   中英

Jersey WebApplicationException 和 servlet 過濾器

[英]Jersey WebApplicationException and servlet filters

在我的應用程序中,我為異常情況拋出 WebApplicationExceptions,以便我可以用我的 500 傳回好的消息。 我遇到的問題是我有一個用於 hibernate 事務的 servlet 過濾器,並且注意到 WebApplicationException 在返回到 servlet 過濾器之前被捕獲。 我已經包含了一個簡短版本的 servlet 過濾器作為示例。 注意:我只有另一個 servlet 過濾器,它進行身份驗證並且沒有捕獲

    try {
        em = MauiPersistenceUtil.getEntityManager();
        em.getTransaction().begin();

        // raises WebApplicationException
        filterChain.doFilter(request, response);

        // since WebApplicationException is trapped somewhere else up 
        // the filterChain bad data is committed here
        em.getTransaction().commit();
    } catch (Throwable ex) {
        // I want the WebApplicationException to reach here
        em.getTransaction().rollback();
    }

謝謝,贖金

編輯:瑞安斯圖爾特指出我實際上並沒有問過問題。 我的問題是:如何在 servlet 過濾器中判斷 web 應用程序異常在 filterChain 中被拋出? 我期待 Jersey 會重新拋出異常,但這是不正確的。

既然你沒有問具體的問題,我會做一些觀察。

  1. 您應該使用聲明性事務,例如 Spring 提供的事務,而不是嘗試以這種方式自己管理它們,因為您會遇到這樣的問題。
  2. 與 1. 類似,我非常懷疑您是否希望在所有異常上回滾事務。 再次,研究一個框架來幫助你。
  3. WebApplicationException 被 Jersey 攔截和處理。 大概您正在以標准方式運行 Jersey 作為 servlet。 過濾器在 servlets 附近執行。 因此,Jersey servlet 在異常進入過濾器之前對其進行處理。

您應該檢查“doFilter”之后的響應狀態:

 filterChain.doFilter(servletRequest, servletResponse);

 Integer status = ((HttpServletResponse) servletResponse).getStatus();
 if (HttpServletResponse.SC_INTERNAL_SERVER_ERROR.equals(status) {
     em.getTransaction().rollback();
 } else {
     em.getTransaction().commit();
 }

如果 Status 為 500 則回滾,就這么簡單。 您永遠不會在 Servlet 過濾器上遇到 WebApplicationException,它們會被 Jersey Servlet 捕獲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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