功能区:无法使用@RibbonClients设置默认配置(defaultConfiguration = ...)

时间:2015-05-29 17:08:33

标签: spring-cloud

@RibbonClients注释允许我们为每个客户端自定义功能区配置。此过程在http://projects.spring.io/spring-cloud/spring-cloud.html#_customizing_the_ribbon_client

的文档中进行了描述

这一切都很好。我尝试使用相同的方法来覆盖应该应用于所有客户端的默认配置。所以我定义了以下配置类,并确保它被组件扫描考虑:

@Configuration
@RibbonClients(defaultConfiguration = MyDefaultRibbonConfig.class)
public class MyRibbonAutoConfiguration {

}

不幸的是,结果是在构建功能区客户端的应用程序上下文时没有考虑MyDefaultRibbonConfig。通过RibbonClientConfigurationRegistrar快速查看和跟踪,我认为我的@RibbonClients(default=...)注释会被org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration提供的注释无条件地覆盖。

但是,如果在内部类而不是顶级类上设置了@RibbonClients注释,它就有效:

@Configuration
public class MyRibbonAutoConfiguration {

   @Configuration
   @RibbonClients(defaultConfiguration = MyDefaultRibbonConfig.class)
   static class SubConfig {
   }

}

这是RibbonClientConfigurationRegistrar为发现的配置bean命名的策略的副作用:

        registerClientConfiguration(registry,
                "default." + metadata.getEnclosingClassName(),
                attrs.get("defaultConfiguration"));

然后在顶级类上声明的注释配置使用设置为default.null.defaultConfiguration的bean名称进行注册 - 因此下一个注册将覆盖前一个(不确定顺序是否可预测)。

这种行为对我来说很奇怪。我错过了什么?我应该采用不同的方式吗?

1 个答案:

答案 0 :(得分:0)

这是SpringCloud-Netflix 1.0.1中的一个问题。有关详细信息,请参阅https://github.com/spring-cloud/spring-cloud-netflix/issues/374