如何在 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>
现在定义MyExceptionFilter
class-
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);
}
}
我想知道 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>
现在定义MyExceptionFilter
class-
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);
}
}