完全禁用Spring Boot异常处理?

时间:2019-11-11 10:04:46

标签: spring spring-boot

我对所有@ControllerAdvice, @ExceptionHandler, DefaultHandlerExceptionResolver, ErrorAttributes, Whitelabel Error Page的东西都感到非常厌倦。

我想摆脱它们,并在我的过滤器链的第一个过滤器中手动处理异常,如下所示:

try {
    chain.doFilter()
} catch (Exception e) {
    ...
}

注意:我确实知道如何禁用Whitelabel Error Page

@SpringBootApplication(exclude = {ErrorMvcAutoConfiguration.class})
public class Application

但这不是我要禁用的唯一功能。我也想摆脱DefaultHandlerExceptionResolver

1 个答案:

答案 0 :(得分:2)

大部分/大部分错误处理由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@ExceptionHandlerDefaultHandlerExceptionResolverWebMvcConfigurationSupport(特别是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的位置/配置以及重写/禁用该配置。