如何使用Spring MVC / Spring Boot编写正确的全局错误处理程序
2022-09-01 02:36:08
我正在使用Spring 4.0.4和Spring Boot 1.0.2编写一个Web应用程序,使用Tomcat作为嵌入式Web容器,我想实现一个全局异常处理,该处理拦截所有异常并以特定方式记录它们。我的简单要求是:
- 我想全局处理尚未在其他地方处理的所有异常(例如,在控制器异常处理程序中)。我想记录消息,并且我想向用户显示自定义错误消息。
- 我不希望Spring或Web容器自己记录任何错误,因为我想自己做。
到目前为止,我的解决方案如下所示(简化,没有日志记录,也没有重定向到错误视图):
@Controller
@RequestMapping("/errors")
public class ErrorHandler implements EmbeddedServletContainerCustomizer
{
@Override
public void customize(final ConfigurableEmbeddedServletContainer factory)
{
factory.addErrorPages(new ErrorPage("/errors/unexpected"));
factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/errors/notfound"));
}
@RequestMapping("unexpected")
@ResponseBody
public String unexpectedError(final HttpServletRequest request)
{
return "Exception: " + request.getAttribute("javax.servlet.error.exception");
}
@RequestMapping("notfound")
@ResponseBody
public String notFound()
{
return "Error 404";
}
}
结果是,该方法正确处理控制器中引发的异常,方法处理 404 状态代码。到目前为止,一切顺利,但我有以下问题:unexpectedError
notFound
- Tomcat 或 Spring(不确定谁负责)仍在记录错误消息。我不想这样做,因为我想自己记录它(包含其他信息),并且我不希望日志中有重复的错误消息。如何阻止此默认日志记录?
- 我访问异常对象的方式似乎不正确。我从请求属性中获取 if 。这甚至不是抛出的异常,它是一个实例,我必须深入研究这个嵌套的异常来获取真正的异常。我很确定有更简单的方法,但我找不到它。
javax.servlet.error.exception
org.springframework.web.util.NestedServletException
那么我该如何解决这些问题呢?或者,也许我实现此全局异常处理程序的方式是完全错误的,并且有更好的选择?