2011-12-28 22 views
-1

我想使用JSF 2.0和Hibernate製作Web應用程序。我想在[異步]的數據庫中記錄異常。使用jsf和hibernate在web項目中異步調用db

我該怎麼做?

+1

你想記錄什麼異常?你到目前爲止創造了什麼? – 2011-12-28 08:46:35

+0

我想記錄在任何級別(數據庫或Java類)的請求期間發生的任何異常...我不想使用log4j,而是想將它記錄到數據庫(使用記錄器,我們通常使用不同的級別) – user1117297 2011-12-28 09:15:58

+1

你只使用Hibernate和JSF嗎? Servlet的? EJB?彈簧?向我們展示一些你到目前爲止的代碼。 – 2011-12-28 09:19:22

回答

3

您在問題中提供的信息實際上有點微不足道,但無論如何我都會給它一個鏡頭。

限制異常記錄這些請求處理過程中發生的(根據您的評論),你的第一個步驟是安裝一個Servlet過濾器:

@WebFilter(filterName="exceptionHandler", urlPatterns="/*") 
public class ExceptionHandler extends HttpFilter { 

    @Override 
    public void doFilter(HttpServletRequest request, HttpServletResponse response, HttpSession session, FilterChain chain) throws ServletException, IOException { 

     try { 
      chain.doFilter(request, response); 
     } catch (Exception e) { 
      // ... handle exception here 
     } 
    } 
} 

如果您已經安裝了其他的過濾器,你會可能需要一個web.xml來調整它們被調用的順序。

下一步是執行異步持久化到數據庫。這取決於您在JSF和Hibernate之外使用的堆棧。例如,Java EE在這裏有一個方便的@Asynchronous註釋,而在Spring中它是@Async。通常JSF通常與Java EE結合在一起,但是人們說他們使用Hibernate而不是JPA,通常傾向於使用Tomcat。

對於Java EE,你會注入一個EJB中的過濾器,使用JPA(可能休眠)的EJB和提到@Asynchronous註釋:

篩選:

@WebFilter(filterName="exceptionHandler", urlPatterns="/*") 
public class ExceptionHandler extends HttpFilter { 

    @EJB 
    private ExceptionPersister exceptionPersister; 

    @Override 
    public void doFilter(HttpServletRequest request, HttpServletResponse response, HttpSession session, FilterChain chain) throws ServletException, IOException { 

     try { 
      chain.doFilter(request, response); 
     } catch (Exception e) { 
      exceptionPersister.persist(e); 
     } 
    } 
} 

EJB:

@Stateless 
public class ExceptionPersister { 

    @PersistenceContext 
    private EntityManager entityManager; 

    @Asynchronous 
    public void persist(Exception exception) { 
     // use entityManager to persist exception in your 
     // specific way. 
    } 
} 
+0

感謝它幫了我很多..我不知道在這裏提到..
**謝謝Arjan Tijms ** – user1117297 2011-12-29 09:04:56

+0

不客氣;) – 2011-12-29 10:33:11