gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:50:42 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com