ErrorWebFluxAutoConfiguration在ErrorWebExceptionHandler类型的应用程序中不尊重Bean

时间:2019-12-13 03:27:28

标签: spring-boot spring-webflux

我通过扩展AbstractErrorWebExceptionHandler类,创建了ErrorWebExceptionHandler类型的组件。

@Component
public class ExceptionHandler extends AbstractErrorWebExceptionHandler {---}

我认为这应该使用ErrorWebFluxAutoConfiguration类中的以下方法来抑制Bean的创建,并且应该尊重我的组件,因为该方法具有类型的ConditionalOnMissingBean注释。 Github Link

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

如果我专门给我的组件一个小于-1的顺序,则我的组件优先(如下所示)。但是,我觉得那是不必要的额外负担,可以/应该避免。

@Component
@Order(-2)
public class ExceptionHandler extends AbstractErrorWebExceptionHandler {---}

1 个答案:

答案 0 :(得分:0)

当我说@Order不必要时,我错了。从Spring Boot的角度来看,这是不必要的(用自己的自定义实现替换了它唯一的ErrorWebExceptionHandler),但是从Spring WebFlux的角度来看,仍然是必需的。

Spring WebFlux支持多个WebExceptionHander实例并按顺序调用它们。 Spring Boot在DefaultErrorWebExceptionHandler下命令-1,以确保它在Spring WebFlux的ResponseStatusExceptionHandlerWebFluxConfigurationSupport下命令的0之前运行。

为确保自定义ErrorWebExceptionHandler在WebFlux的ResponseStatusExceptionHandler之前运行,必须按比ResponseStatusExceptionHandler更高的优先级(较低的值)对其进行排序。后者的顺序为0,因此您应使用-1或更小的顺序。