Spring boot ErrorWebFluxAutoConfiguration不考虑ErrorWebExceptionHandler类型的应用程序中的bean

Spring boot ErrorWebFluxAutoConfiguration不考虑ErrorWebExceptionHandler类型的应用程序中的bean,spring-boot,spring-webflux,Spring Boot,Spring Webflux,我通过扩展AbstractErrorWebExceptionHandler类创建了ErrorWebExceptionHandler类型的组件,如下所示 @Component public class ExceptionHandler extends AbstractErrorWebExceptionHandler {---} 我假设这应该禁止使用ErrorWebFluxAutoConfiguration类中的以下方法创建bean,并且应该尊重我的组件,因为该方法具有类型的Conditional

我通过扩展AbstractErrorWebExceptionHandler类创建了ErrorWebExceptionHandler类型的组件,如下所示

@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 {---}