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



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

?我正在使用jersey和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 的方法过滤器,我在其中验证我的 jwt 令牌并接受或拒绝授权。

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

提前谢谢。

我认为有一些独立于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>

然后定义ExceptionHandlerservlet -

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

相关内容

最新更新