Spring cloud 我如何可以覆盖“引用”;ribbonServerListFilter“;

Spring cloud 我如何可以覆盖“引用”;ribbonServerListFilter“;,spring-cloud,Spring Cloud,我希望能够覆盖默认的Spring云“ribbonServerListFilter”实现。我已经阅读了文档,但是我总是会收到一个关于它找不到的bean的错误(IClientConfig) 所以我有一个简单的类,比如: @Configuration public class FooConfiguration { @Bean public ServerListFilter<Server> ribbonServerListFilter(IClientConfig confi

我希望能够覆盖默认的Spring云“ribbonServerListFilter”实现。我已经阅读了文档,但是我总是会收到一个关于它找不到的bean的错误(IClientConfig)

所以我有一个简单的类,比如:

@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);
    }
}