ErrorWebFluxAutoConfiguration 不考虑应用程序中的 Bean for ErrorWebExc



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

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

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

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

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

Spring WebFlux 支持多个WebExceptionHander实例,并按顺序调用它们。Spring Boot 在-1点订购其DefaultErrorWebExceptionHandler,这确保了它在 Spring WebFlux 的ResponseStatusExceptionHandler之前运行,WebFluxConfigurationSupport0点订购。

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

相关内容

最新更新