Spring boot ErrorWebFluxAutoConfiguration不考虑ErrorWebExceptionHandler类型的应用程序中的bean
我通过扩展AbstractErrorWebExceptionHandler类创建了ErrorWebExceptionHandler类型的组件,如下所示Spring boot ErrorWebFluxAutoConfiguration不考虑ErrorWebExceptionHandler类型的应用程序中的bean,spring-boot,spring-webflux,Spring Boot,Spring Webflux,我通过扩展AbstractErrorWebExceptionHandler类创建了ErrorWebExceptionHandler类型的组件,如下所示 @Component public class ExceptionHandler extends AbstractErrorWebExceptionHandler {---} 我假设这应该禁止使用ErrorWebFluxAutoConfiguration类中的以下方法创建bean,并且应该尊重我的组件,因为该方法具有类型的Conditional
@Component
public class ExceptionHandler extends AbstractErrorWebExceptionHandler {---}
我假设这应该禁止使用ErrorWebFluxAutoConfiguration类中的以下方法创建bean,并且应该尊重我的组件,因为该方法具有类型的ConditionalOnMissingBean注释(
)
我说错了,
@Order
不应该是必需的。从Spring Boot的角度来看,它是不必要的(它唯一的ErrorWebExceptionHandler
被您的自定义实现所取代),但从Spring WebFlux的角度来看,它仍然是必要的
SpringWebFlux支持多个WebExceptionHander
实例,并按顺序调用它们。Spring Boot在-1
处命令其DefaultErrorWebExceptionHandler
,以确保它在Spring WebFlux的ResponseStatusExceptionHandler
之前运行,后者WebFluxConfiguration Support
在0
处命令
要确保自定义的
ErrorWebExceptionHandler
在WebFlux的ResponseStatusExceptionHandler
之前运行,其优先级(值)必须高于ResponseStatusExceptionHandler
。后者的顺序为0
,因此您应该使用-1
或更少的顺序 @Order
应该不是必需的。我怀疑在自动配置处理程序之后才定义处理程序,因此不会导致自动配置处理程序退出。我需要看一个例子来说明为什么会这样。@AndyWilkinson我已经为您创建了一个小的例子。我注意到的一件事是,如果我没有ResourceNotFoundException上的@ResponseStatus
,则行为与预期一样。但是,我需要它根据异常给出正确的Http状态。正如我前面提到的,如果我取消注释@Order
,它会像预期的那样工作,感谢您的回复@AndyWilkinson。因此,必须有一个@order
注释。那么,您是否认为@ConditionalOnMissingBean
注释没有效果,并且可以/应该从上面的errorWebExceptionHandler方法中删除,因为我们这里的范围仅限于WebFlux?我认为不应该删除它,因为它确实有效果。自动配置的ErrorWebExceptionHandler
将在您定义自己的时退出。啊,我明白您的意思了。ErrorWebExceptionHandler将退出,但WebFlux ResponseStatusExceptionHandler不会退出。如果它是这样设计的,我将继续使用自定义ErrorWebExceptionHandler
中的@Order
。谢谢你的时间和帮助。非常感谢。
@ConditionalOnMissingBean(
value = {ErrorWebExceptionHandler.class},
search = SearchStrategy.CURRENT
)
@Order(-1)
public ErrorWebExceptionHandler errorWebExceptionHandler(ErrorAttributes errorAttributes, ResourceProperties resourceProperties, ObjectProvider<ViewResolver> viewResolvers, ServerCodecConfigurer serverCodecConfigurer, ApplicationContext applicationContext) {
DefaultErrorWebExceptionHandler exceptionHandler = new DefaultErrorWebExceptionHandler(errorAttributes, resourceProperties, this.serverProperties.getError(), applicationContext);
exceptionHandler.setViewResolvers((List)viewResolvers.orderedStream().collect(Collectors.toList()));
exceptionHandler.setMessageWriters(serverCodecConfigurer.getWriters());
exceptionHandler.setMessageReaders(serverCodecConfigurer.getReaders());
return exceptionHandler;
}
@Component
@Order(-2)
public class ExceptionHandler extends AbstractErrorWebExceptionHandler {---}