我怎样才能覆盖 "ribbonServerListFilter"
How can I override "ribbonServerListFilter"
我希望能够覆盖默认的 Spring 云 'ribbonServerListFilter' 实现。我已经阅读了文档,但我总是收到有关找不到的 bean (IClientConfig) 的错误。
所以我有一个简单的 class 比如:
@Configuration
public class FooConfiguration {
@Bean
public ServerListFilter<Server> ribbonServerListFilter(IClientConfig config) {
MyListFilter filter = new MyListFilter();
filter.initWithNiwsConfig(config);
return filter;
}
}
和:
@Configuration
@RibbonClient(name = "foo", configuration = FooConfiguration.class)
public class TestConfiguration {
}
但是在运行时我得到:
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.RELEASE.
提前致谢。
亨利
更新:
在 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);
}
}
和不同包中的主要应用程序:
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);
}
}
所以在第二次测试中调用 'loadBalancer.choose' 我希望我的代码被调用。
您必须确保您的 FooConfiguration
未被扫描。放在单独的包里,不要放在主应用下,或者不要用@ComponentScan
.
我希望能够覆盖默认的 Spring 云 'ribbonServerListFilter' 实现。我已经阅读了文档,但我总是收到有关找不到的 bean (IClientConfig) 的错误。
所以我有一个简单的 class 比如:
@Configuration
public class FooConfiguration {
@Bean
public ServerListFilter<Server> ribbonServerListFilter(IClientConfig config) {
MyListFilter filter = new MyListFilter();
filter.initWithNiwsConfig(config);
return filter;
}
}
和:
@Configuration
@RibbonClient(name = "foo", configuration = FooConfiguration.class)
public class TestConfiguration {
}
但是在运行时我得到:
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.RELEASE.
提前致谢。
亨利
更新:
在 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);
}
}
和不同包中的主要应用程序:
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);
}
}
所以在第二次测试中调用 'loadBalancer.choose' 我希望我的代码被调用。
您必须确保您的 FooConfiguration
未被扫描。放在单独的包里,不要放在主应用下,或者不要用@ComponentScan
.