我对所有@ControllerAdvice, @ExceptionHandler, DefaultHandlerExceptionResolver, ErrorAttributes, Whitelabel Error Page
的东西都感到非常厌倦。
我想摆脱它们,并在我的过滤器链的第一个过滤器中手动处理异常,如下所示:
try {
chain.doFilter()
} catch (Exception e) {
...
}
注意:我确实知道如何禁用Whitelabel Error Page
:
@SpringBootApplication(exclude = {ErrorMvcAutoConfiguration.class})
public class Application
但这不是我要禁用的唯一功能。我也想摆脱DefaultHandlerExceptionResolver
。
答案 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
,@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的位置/配置以及重写/禁用该配置。