我怎样才能覆盖 "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.