Spring cloud 我如何可以覆盖“引用”;ribbonServerListFilter“;
我希望能够覆盖默认的Spring云“ribbonServerListFilter”实现。我已经阅读了文档,但是我总是会收到一个关于它找不到的bean的错误(IClientConfig) 所以我有一个简单的类,比如:Spring cloud 我如何可以覆盖“引用”;ribbonServerListFilter“;,spring-cloud,Spring Cloud,我希望能够覆盖默认的Spring云“ribbonServerListFilter”实现。我已经阅读了文档,但是我总是会收到一个关于它找不到的bean的错误(IClientConfig) 所以我有一个简单的类,比如: @Configuration public class FooConfiguration { @Bean public ServerListFilter<Server> ribbonServerListFilter(IClientConfig confi
@Configuration
public class FooConfiguration {
@Bean
public ServerListFilter<Server> ribbonServerListFilter(IClientConfig config) {
MyListFilter filter = new MyListFilter();
filter.initWithNiwsConfig(config);
return filter;
}
}
但在运行时,我得到:
org.springframework.beans.factory.UnsatisfiedDependencyException: \
Error creating bean with name 'ribbonServerListFilter' defined in class path \
resource [FooConfiguration.class]: Unsatisfied dependency expressed through \
constructor argument with index 0 of type \
[com.netflix.client.config.IClientConfig]: : No qualifying bean of type \
[com.netflix.client.config.IClientConfig] found for dependency
那么我做错了什么
这是Spring Boot 1.3.1.0版本
提前谢谢
亨利
更新:
在Dave的评论后添加完整源代码
package com.domain1;
...
@Configuration
public class FooConfiguration {
@Bean
public ServerListFilter<Server> ribbonServerListFilter(IClientConfig config) {
System.out.println("My ribbonServerListFilter will be used");
MyListFilter filter = new MyListFilter();
filter.initWithNiwsConfig(config);
return filter;
}
}
package com.domain1;
...
public class MyListFilter extends ZonePreferenceServerListFilter {
@Override
public List<Server> getFilteredListOfServers(List<Server> servers) {
System.out.println("This is my version");
return super.getFilteredListOfServers(servers);
}
}
因此,在调用“loadBalancer.choose”的第二个测试中,我希望调用我的代码。您必须确保您的
FooConfiguration
未被扫描。把它放在一个单独的包中,不在主应用程序下,或者不要使用@ComponentScan
所以把FooConfiguration放在com.domain1下,但把TestConfiguration放在com.domain2下(像我的main())?我试过了,但覆盖似乎从未注册,默认设置(ZonePreferenceServerListFilter)仍在执行。新的行为(记录错误)是什么?也许是一个重现问题的项目?斯宾塞,请看上面的代码。我用我的测试应用程序更新了它。没有运行时错误。但它从不调用我的代码。请参阅以获取一个有效的示例。之后,当我对应用程序建模时,它会按预期工作。问题是我调用了配置(“foo”)而不是我试图实现负载平衡的服务(“服务”)。同样地称呼他们解决了问题。谢谢你的帮助!
package com.domain1;
...
@Configuration
public class FooConfiguration {
@Bean
public ServerListFilter<Server> ribbonServerListFilter(IClientConfig config) {
System.out.println("My ribbonServerListFilter will be used");
MyListFilter filter = new MyListFilter();
filter.initWithNiwsConfig(config);
return filter;
}
}
package com.domain1;
...
public class MyListFilter extends ZonePreferenceServerListFilter {
@Override
public List<Server> getFilteredListOfServers(List<Server> servers) {
System.out.println("This is my version");
return super.getFilteredListOfServers(servers);
}
}
package com.domain2;
...
@Configuration
@RibbonClient(name = "foo", configuration = FooConfiguration.class)
public class TestConfiguration {
}
package com.domain2;
...
@Component
@Configuration
public class Runner implements CommandLineRunner {
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private LoadBalancerClient loadBalancer;
public void run(String... strings) throws Exception {
System.out.println("all");
for (ServiceInstance s : discoveryClient.getInstances("service")) {
System.out.println(s.getHost() + ":" + s.getPort());
}
System.out.println("from lb");
ServiceInstance instance = loadBalancer.choose("service");
System.out.println(instance.getHost() + ":" + instance.getPort());
}
}
package com.domain2;
...
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}