完全禁用 Spring Boot 异常处理?
Posted
技术标签:
【中文标题】完全禁用 Spring Boot 异常处理?【英文标题】:Completely disable Spring Boot exception handling? 【发布时间】:2020-03-07 00:23:54 【问题描述】:我真的厌倦了所有这些@ControllerAdvice, @ExceptionHandler, DefaultHandlerExceptionResolver, ErrorAttributes, Whitelabel Error Page
的东西。
我想摆脱这一切并在我的过滤器链的第一个过滤器中手动处理异常,如下所示:
try
chain.doFilter()
catch (Exception e)
...
注意:我知道如何禁用Whitelabel Error Page
:
@SpringBootApplication(exclude = ErrorMvcAutoConfiguration.class)
public class Application
但这不是我想要禁用的唯一内容。我也想摆脱DefaultHandlerExceptionResolver
。
【问题讨论】:
Spring Boot Remove Whitelabel Error Page的可能重复 @MounirMessaoudi 我知道如何禁用 Whitelabel 错误页面,但这并不是我想要禁用的所有内容。 【参考方案1】:大部分/大部分错误处理由ErrorMvcAutoConfiguration
配置。所以你需要从你的应用程序中排除这个自动配置:
通过注释:
@EnableAutoConfiguration(exclude = org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration)
或配置属性:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
如果您使用的是响应式 Spring,那么您需要排除 ErrorWebFluxAutoConfiguration
。
请记住,可能还有其他配置会配置其他错误 bean,但这应该注意大部分。您需要调试/逐步完成应用程序启动过程,以找出配置其他 bean 的位置/内容,并禁用该自动配置。
根据我的调试,@ControllerAdvice
、@ExceptionHandler
和 DefaultHandlerExceptionResolver
被 WebMvcConfigurationSupport 引导,特别是 handlerExceptionResolver
方法。
如 javadocs 中所述:
另一种更高级的选择是直接从此类扩展并根据需要覆盖方法,记住将@Configuration 添加到子类,将@Bean 添加到覆盖的@Bean 方法。有关详细信息,请参阅 @EnableWebMvc 的 javadoc。
高级选项可能是您想要的,因为您想完全控制 Spring Boot 提供的错误处理。因此,请遵循 javadoc 的建议:
@Configuration
public class CustomWebMvcConfigurationSupport extends WebMvcConfigurationSupport
@Override
protected void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers)
// Define your custom resolvers here.
// List must NOT be empty otherwise default resolves will kick in.
@Bean
@Override
public HandlerExceptionResolver handlerExceptionResolver(
@Qualifier("mvcContentNegotiationManager") ContentNegotiationManager contentNegotiationManager)
// Or completely take control over the resolvers
HandlerExceptionResolverComposite composite = new HandlerExceptionResolverComposite();
composite.setOrder(0);
composite.setExceptionResolvers(Collections.emptyList());
return composite;
但同样,如上所述,您将需要调试/逐步执行应用程序启动过程,以找出您要禁用的其他 bean 的配置位置/内容,并覆盖/禁用该配置。
【讨论】:
谢谢,我知道ErrorMvcAutoConfiguration
。我正在寻找一种方法来禁用“配置其他错误 bean 的其他配置”。以上是关于完全禁用 Spring Boot 异常处理?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理