是否有好的选项来删除或禁用默认的Springbean?

myss37ts  于 2023-04-04  发布在  Spring
关注(0)|答案(1)|浏览(72)

激发这个问题的场景是Spring WebFlux的WebExceptionHandler

@Bean
@Order(-2)
public WebExceptionHandler exceptionHandler() {
    return (exchange, ex) -> {
        // Handle exceptions
    };
}

在上面的代码示例中,我使用@Order注解来确保我的异常处理程序优先于Spring WebFlux附带的DefaultErrorWebExceptionHandler。这是一个有效的解决方案。@Primary也是。然而,我真的不喜欢它们中的任何一个。
这背后的原因是,依赖基于顺序的功能来确保我的代码行为对我来说是不愉快的。我宁愿找到一种方法从Spring容器中排除DefaultErrorWebExceptionHandler,这样我的实现就是唯一可用的WebExceptionHandler。然而,DefaultErrorWebExceptionHandler是由Spring自动连接的,我不知道任何排除它的方法。
我想知道有什么选择可以实现这一目标。

unhi4e5o

unhi4e5o1#

Sping Boot 提供了默认值,可以排除或使用用户提供的bean。这是关键功能之一。
假设WebFlux ErrorExceptionHandler当前看起来是这样的,

@AutoConfiguration(before = WebFluxAutoConfiguration.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
@ConditionalOnClass(WebFluxConfigurer.class)
@EnableConfigurationProperties({ ServerProperties.class, WebProperties.class })
public class ErrorWebFluxAutoConfiguration {

    private final ServerProperties serverProperties;

    public ErrorWebFluxAutoConfiguration(ServerProperties serverProperties) {
        this.serverProperties = serverProperties;
    }

    @Bean
    @ConditionalOnMissingBean(value = ErrorWebExceptionHandler.class, search = SearchStrategy.CURRENT)
    @Order(-1)
    public ErrorWebExceptionHandler errorWebExceptionHandler(ErrorAttributes errorAttributes,
            WebProperties webProperties, ObjectProvider<ViewResolver> viewResolvers,
            ServerCodecConfigurer serverCodecConfigurer, ApplicationContext applicationContext) {
        DefaultErrorWebExceptionHandler exceptionHandler = new DefaultErrorWebExceptionHandler(errorAttributes,
                webProperties.getResources(), this.serverProperties.getError(), applicationContext);
        exceptionHandler.setViewResolvers(viewResolvers.orderedStream().toList());
        exceptionHandler.setMessageWriters(serverCodecConfigurer.getWriters());
        exceptionHandler.setMessageReaders(serverCodecConfigurer.getReaders());
        return exceptionHandler;
    }

    @Bean
    @ConditionalOnMissingBean(value = ErrorAttributes.class, search = SearchStrategy.CURRENT)
    public DefaultErrorAttributes errorAttributes() {
        return new DefaultErrorAttributes();
    }

}

你也可以
1.创建实现ErrorWebExceptionHandler而不是WebExceptionHandler的Bean
1.不包括ErrorWebFluxAutoConfiguration.class,它可以通过几种方式完成,但现在通常通过@SpringBootApplication(exclude = { ErrorWebFluxAutoConfiguration.class })完成。

相关问题