Spring-Boot错误页面映射& NestedServletException

时间:2015-05-18 17:13:48

标签: java spring spring-mvc spring-boot

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

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

@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 / 403s等) - 但是,我的控制器中抛出的异常似乎包含在NestedServletException中,这意味着当我添加带有异常的自定义ErrorPage时,它永远不会正确映射。

有没有办法解决这个问题而没有明确地捕获异常并将它们重新抛弃为其他东西?我已经设法通过扩展ErrorPageFilter并检查此异常并检查根本原因来使其工作,但是不希望这样做。

这是设计吗?有人遇到并制定出优雅的解决方案吗?我提出的两个解决方案是自定义ErrorPageFilter(这不是很好,因为它可能使升级版本等更难)或者有一个全局@ControllerAdvice异常处理程序来捕获这些异常然后将它们抛回再次 - 任何更好的选择?这件事会被修复/改变吗?

1 个答案:

答案 0 :(得分:0)

如果有异常解决您的异常,Spring将抛出NestedServletException。我不相信这是你的问题。 :)

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

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