我通过扩展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 {---}
答案 0 :(得分:0)
当我说@Order
不必要时,我错了。从Spring Boot的角度来看,这是不必要的(用自己的自定义实现替换了它唯一的ErrorWebExceptionHandler
),但是从Spring WebFlux的角度来看,仍然是必需的。
Spring WebFlux支持多个WebExceptionHander
实例并按顺序调用它们。 Spring Boot在DefaultErrorWebExceptionHandler
下命令-1
,以确保它在Spring WebFlux的ResponseStatusExceptionHandler
在WebFluxConfigurationSupport
下命令的0
之前运行。
为确保自定义ErrorWebExceptionHandler
在WebFlux的ResponseStatusExceptionHandler
之前运行,必须按比ResponseStatusExceptionHandler
更高的优先级(较低的值)对其进行排序。后者的顺序为0
,因此您应使用-1
或更小的顺序。