2017-07-07 1 views
2

Ich frage mich, ob es etwas wie Application_Error von Global.asax in asp.net aber in Java gibt?Wie fangen Anwendungsfehler in Java/Jax-rs

Ich benutze Jersey & angularJS. Ich implementierte bereits die ServletContextListener, die ich getestet und es funktioniert, aber nicht so etwas wie 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"); 
    } 

} 

ich auch eine Klasse, die implementiert die Methode Filter von ContainerRequestFilter finden, wo ich meine jwt Token zu validieren und akzeptieren oder die Genehmigung ablehnen.

Alle meine Methoden behandeln nicht die Ausnahme innerhalb, es bedeutet, dass ich die Ausnahme der gesamten Anwendung abfangen möchte, auch wenn es in einer Ressource, einer Methode aus Service-Layer oder Datenzugriffsschicht usw. erzeugt wird Versuchen Sie, eine E-Mail an admin zu senden und auf die Seite error.html umzuleiten.

Vielen Dank im Voraus.

Antwort

0

Ich denke, es gibt einige Lösungen unabhängig von Jersey, die Sie zum Abfangen aller Ausnahmen in einer Java-Webanwendung implementieren können. Ich gehe davon aus, dass Ihr Projekt web.xml hat -

1) Filter Mit - Sie eine filter in Ihrer Web-Anwendung hinzufügen und alle Ausnahmen dort fangen. Filter ist wie ein Interceptor, der vor der Verarbeitung einer Anfrage aufgerufen werden kann.

können Sie Filter definieren, in 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> 

Jetzt MyExceptionFilter Klasse definieren -

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() { 
    } 

} 

Problem bei diesem Ansatz ist, dass es möglich ist, mehrere Filter in einer Web-Anwendung zu definieren. Die Reihenfolge, wie diese Filter aufgerufen werden, ist nicht festgelegt.

2) Fehler Seite - Sie können auch eine Fehlerseite für die Webanwendung definieren. In web.xml, fügen Sie unter Linien -

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

und dann ExceptionHandler Servlet definieren -

@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); 
    } 
}