So ersetzen Sie eine vorhandene bean im spring-boot-Anwendung?
Ich spring-boot-Anwendung, Da schon eine bean-Erstellung in einem auto-configuration-Klasse aus einer abhängigen jar wie unten:
@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);
}
Nun möchte ich diese ersetzen Bohne, aber ich muss immer noch dieses jar, die diese unerwünschte Bean Schöpfung. Also ich habe eine andere bean creation Methode in meiner main-auto-configuration-Klasse wie folgt aus:
@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);
}
Aber dieser Fehler beim ersetzen der Ziel-bean. Der Fehler msg ist klar und einfach zu verstehen:
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]
Meine Frage, was ist der richtige Weg, um Ersatz für die bestehenden bean im spring-boot? Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem in diesem Fall ist, dass Sie nicht zu ersetzen, das bean mit dem Namen staticRouteLocator. Sie erstellen eine andere bean mit dem Namen patchedStaticRouteLocator. Wäre dies nicht ein problem im Allgemeinen, aber es scheint, dass ist nicht das, was Sie wollen.
Den
NoUniqueBeanDefinitionException
wird erhöht, da Sie auch Hinzugefügt@Primary
Anmerkung, und jetzt gibt es mindestens zwei Bohnen als "primär" markiert Verdrahtung Kandidat. Spring nicht wissen, was es jetzt tun sollte.Wenn Sie wirklich wollen, überschreiben Sie die erste Bohne, geben Sie ihm den gleichen Namen. Die default-Namen (wenn es keine anderen Namen explizit angegeben) wäre der name der Methode, definieren Sie in Ihrem
@Configuration
Klasse. In Ihrem Fall wäre dies patchedStaticRouteLocator. (Im moment definieren Sie auch die gleichen Namen wieder mit der@Bean
Anmerkungenname
Eigenschaft, das ist irgendwie redundant und nicht notwendig).Wenn Sie möchten, ersetzen Sie die Bohne mit dem Namen /alias staticRouteLocator, geben Sie Ihrem neuen bean mit dem gleichen Namen, so definieren es wie:
@Bean(name="staticRouteLocator")
Sollte, überschreiben die erste Bohne.
Können Sie zählen Ihre Bohnen mit einem check so:
Ersetzen Sie einfach die 1 mit der Anzahl, die Sie erwarten (vor und nach).
BeanPostProcessor
Komponente.Ziel erreicht durch die Implementierung einer
BeanPostProcessor
: