完全禁用 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@ExceptionHandlerDefaultHandlerExceptionResolver 被 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 中的全局异常处理

Spring boot集中异常处理

尝试传递参数时,Spring批处理中的@StepScope抛出异常

Spring Boot-全局异常处理

Spring boot 异常配置

Spring boot 异常配置