gpt4 book ai didi

spring-boot - 如何替换 Spring Boot 应用程序中的现有 bean?

转载 作者:行者123 更新时间:2023-12-04 03:28:48 25 4
gpt4 key购买 nike

我 spring 启动应用程序,已经在一个自动配置类中创建了一个 bean,来自一个依赖的 jar,如下所示:

@Bean
@Order(100)
public StaticRouteLocator staticRouteLocator(AdminServerProperties admin) {
Collection<ZuulRoute> routes = Collections
.singleton(new ZuulRoute(admin.getContextPath() + "/api/turbine/stream/**",
properties.getUrl().toString()));
return new StaticRouteLocator(routes, server.getServletPrefix(), zuulProperties);
}

现在我想替换这个 bean,但我仍然需要这个 jar,它有这个不需要的 Bean 创建。所以我在我的主要自动配置类中添加了另一个 bean 创建方法,如下所示:
  @Bean(name="patchedStaticRouteLocator")
@Order(10)
@Primary
@ConditionalOnMissingBean
public StaticRouteLocator patchedStaticRouteLocator(AdminServerProperties admin) {
Collection<ZuulProperties.ZuulRoute> routes = Collections
.singleton(new ZuulProperties.ZuulRoute(admin.getContextPath(),
properties.getUrl().toString()));
return new StaticRouteLocator(routes, server.getServletPrefix(), zuulProperties);
}

但这未能替换目标 bean。错误信息清晰易懂:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.cloud.netflix.zuul.filters.RouteLocator] is defined: more than one 'primary' bean found among candidates: [routeLocator, patchedStaticRouteLocator, staticRouteLocator, compositeRouteLocator, applicationRouteLocator]

我的问题是在 Spring Boot 中替换现有 bean 的正确方法是什么?提前致谢。

最佳答案

在这种情况下的问题是,您没有用名称 staticRouteLocator 替换这个 bean。您正在创建另一个名为 patchedStaticRouteLocator 的 bean。这通常不是问题,但似乎这不是您想要的。

提升 NoUniqueBeanDefinitionException 是因为您还添加了 @Primary 注释,现在至少有两个 bean 标记为主要接线候选者。 Spring不知道它现在应该做什么。

如果你真的想覆盖第一个 bean,给它一个相同的名字。默认名称(如果没有明确指定其他名称)将是您在 @Configuration 类中定义的方法的名称。在您的情况下,这将是 patchedStaticRouteLocator。 (目前,您还使用 @Bean 注释 name 属性再次定义了相同的名称,这有点多余,不需要。)

如果你想用名称/别名 staticRouteLocator 替换 bean,给你的新 bean 赋予相同的名称,因此定义它如下:
@Bean(name="staticRouteLocator")
那应该覆盖第一个bean。

你可以用这样的支票来数你的 bean :

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class BeanConfigTest {

@Autowired
private ApplicationContext applicationContext;

@Test
public void countBeanNames() {
final String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
assertThat(beanDefinitionNames.length, is(1));
}

}

只需将 1 替换为您期望的计数(前后)。

关于spring-boot - 如何替换 Spring Boot 应用程序中的现有 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41694969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com