java - Spring-Boot 错误页面映射和 NestedServletException

标签 java spring spring-mvc spring-boot

我有一个 Spring Boot 应用程序,它作为独立的 WAR 文件在 Tomcat 上运行。

我的错误配置中有正常的错误页面映射,如下所示:

@Configuration
class ErrorConfiguration implements EmbeddedServletContainerCustomizer {

  @Override public void customize( ConfigurableEmbeddedServletContainer container ) {
      container.addErrorPages( new ErrorPage( HttpStatus.BAD_REQUEST, "/400" ) )
      container.addErrorPages( new ErrorPage( HttpStatus.FORBIDDEN, "/403" ) )
      container.addErrorPages( new ErrorPage( HttpStatus.NOT_FOUND, "/404" ) )
      container.addErrorPages( new ErrorPage( HttpStatus.METHOD_NOT_ALLOWED, "/405" ) )   
      container.addErrorPages( new ErrorPage( HttpStatus.INTERNAL_SERVER_ERROR, "/500" ) )
      container.addErrorPages( new ErrorPage( HttpStatus.NOT_IMPLEMENTED, "/501" ) )
      container.addErrorPages( new ErrorPage( HttpStatus.BAD_GATEWAY, "/502" ) )
      container.addErrorPages( new ErrorPage( HttpStatus.SERVICE_UNAVAILABLE, "/503" ) )
  }

这一切都工作正常,但是,我也有一些从其他库抛出的异常,我想映射到特定的错误代码(相当于未找到/未授权,我想映射到 404/403 等) - 但是, Controller 中抛出的异常似乎包含在 NestedServletException 中,这意味着当我添加带有异常的自定义 ErrorPage 时,它永远不会正确映射。

有没有一种方法可以解决这个问题,而无需显式捕获异常并将其重新抛出为其他内容?我已经设法通过扩展 ErrorPageFilter 并检查此异常并检查根本原因来使其工作,但我宁愿不必这样做。

这是设计使然吗?有人遇到过并找到了一个优雅的解决方案吗?我提出的两个解决方案是自定义 ErrorPageFilter (这不是很好,因为它可能使升级版本等变得更加困难)或使用全局 @ControllerAdvice 异常处理程序来捕获这些异常,然后再次将它们抛出 - 还有更好的选择吗?这是要修复/改变的东西吗?

最佳答案

如果出现异常,Spring 将抛出一个 NestedServletException 来解决您的异常。但我不认为这是你的问题。 :)

对于将异常(第三方、外部等)映射到 HTTP 状态代码,您可以使用 @ControllerAdvice@ExceptionHandler@ResponseCode 的组合,而不会抛出异常。

@ControllerAdvice
class CustomExceptionHandler {
    @ResponseStatus(HttpStatus.NOT_FOUND)  // 404
    @ExceptionHandler(SomeThirdPartyException.class)
    public void handleSomeThirdPartyException() {}
}

关于java - Spring-Boot 错误页面映射和 NestedServletException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30309182/

相关文章:

java - 如何将自定义性能计数器数据从 Application Insights Java SDK 插入到云服务

java - 方法不必要地被调用?

Java - 带有 ImageIcon 的 JLabel 上的 setLocation/Bounds 不适用于另一个类

java - 使用 Autowiring 时,抽象类对象的子类为 null

java - Spring MVC : Adding multiple filters to list

Java最长子序列

java - Spring Mail 内联图像未附加

java - 自定义 Spring 范围?

java - Spring boot - Controller 捕获所有 URL

arrays - 使用 Spring MVC 从 Jquery ajax 方法返回字符串数组