如何在 java/jax-rs 中捕获应用程序错误

How to catch application errors in java/jax-rs

我想知道 Global.asax 在 asp.net 但在 java 中是否有类似 Application_Error 的东西?

我正在使用球衣 & 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");
    }

}

我还有一个 class,它实现了来自 ContainerRequestFilter 的方法过滤器,我在其中验证我的 jwt 令牌并接受或拒绝授权。

我所有的方法都没有处理内部的异常,这意味着我想捕获整个应用程序的异常,即使它是在资源、服务层或数据访问层的方法等中产生的。并尝试向管理员发送电子邮件并重定向到 error.html 页面。

提前致谢。

我认为有一些独立于 Jersey 的解决方案,您可以实施这些解决方案来捕获 java 网络应用程序中的所有异常。我假设您的项目有 web.xml -

1) 使用过滤器 - 您可以在您的网络应用程序中添加一个 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> 

现在定义MyExceptionFilterclass-

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