2017-07-07 67 views
2

我不知道是否有在asp.net但在Java類似的Application_Error東西從Global.asax中應用程序錯誤?如何捕捉在Java/JAX-RS

我用的球衣& angularJS。我已經實現了我測試了ServletContextListener和它的作品,卻找不到類似的Application_Error

public class MyListener implements ServletContextListener { 

    @Override 
    public void contextDestroyed(ServletContextEvent arg0) { 
     System.out.println("Shutting down"); 
    } 

    @Override 
    public void contextInitialized(ServletContextEvent arg0) { 
     System.out.println("Starting"); 
    } 

} 

我也有它實現從ContainerRequestFilter哪裏驗證我的智威湯遜令牌並接受或拒絕授權的方法過濾器的類。

所有我的方法不處理中的異常,就意味着我要趕整個應用程序,即使它是在資源產生的例外,從業務層或數據訪問層等的方法和嘗試發送電子郵件給管理員並重定向到error.html頁面。

在此先感謝。

回答

0

我覺得有一些解決方案獨立的Jersey可以實現在Java Web應用程序捕獲所有異常。我假設你的項目有web.xml -

1)使用過濾器 - 您可以添加在你的web應用程序一個filter和捕獲所有異常出現。 Filter就像一個可以在處理任何請求之前調用的攔截器。

可以在web.xml定義過濾器 -

<filter> 
    <filter-name>exceptionFilter</filter-name> 
    <filter-class>com.MyExceptionFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>exceptionFilter</filter-name> 
    <url-pattern>*</url-pattern> 
</filter-mapping> 

現在定義MyExceptionFilter類 -

public final class MyExceptionFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) { 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) { 
     try { 
      // forward request to subsequent filter/resource/servlet 
      filterChain.doFilter(request, response); 
     } catch (Throwable ex) { 
      // do whatever you want in case any exception occurred and not caught in the request processing class 
      // forward request to error page 
      request.getRequestDispatcher("/ErrorPage.jsp").forward(request, response); 
     } 
    } 

    @Override 
    public void destroy() { 
    } 

} 

問題這種方法是有可能在Web應用程序中定義多個過濾器。這些過濾器如何被調用的順序並不固定。

2)錯誤頁面 - 您也可以爲Web應用程序定義錯誤頁面。在web.xml,添加下面線 -

<error-page> 
     <exception-type>java.lang.Throwable</exception-type> 
     <location>/ExceptionHandler</location> 
</error-page> 

然後定義ExceptionHandler的servlet -

@WebServlet("/ExceptionHandler") 
public class ExceptionHandler extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    protected void doGet(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException { 
     processException(request, response); 
    } 

    protected void doPost(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException { 
     processException(request, response); 
    } 
    private void processException(HttpServletRequest request, 
      HttpServletResponse response) throws IOException { 
     Throwable throwable = (Throwable) request 
       .getAttribute("javax.servlet.error.exception"); 
     // do whatever you want to do with exception   
     // forward request to error page 
     request.getRequestDispatcher("/ErrorPage.jsp").forward(request, response); 
    } 
}