Spring 无法插入LoadBalanced注释的OAuth2RestTemplate

Spring 无法插入LoadBalanced注释的OAuth2RestTemplate,spring,spring-boot,spring-cloud,spring-oauth2,spring-cloud-connectors,Spring,Spring Boot,Spring Cloud,Spring Oauth2,Spring Cloud Connectors,我正在使用SpringCloudAngel.SR4。我创建OAuth2RestTemplatebean的配置类如下: @Configuration public class OAuthClientConfiguration { @Autowired private MyClientCredentialsResourceDetails resource; public OAuthClientConfiguration() { } @Bean @Q

我正在使用SpringCloudAngel.SR4。我创建
OAuth2RestTemplate
bean的配置类如下:

@Configuration
public class OAuthClientConfiguration {
    @Autowired
    private MyClientCredentialsResourceDetails resource;

    public OAuthClientConfiguration() {
    }

    @Bean
    @Qualifier("MyOAuthRestTemplate")
    public OAuth2RestTemplate restTemplate() {
        return new OAuth2RestTemplate(this.resource);
    }
}
这个配置非常好,因为我在一个假的
RequestInterceptor
中使用了这个
restemplate
,用于向假请求注入访问令牌。问题是,当我用
@LoadBalanced
注释自动连接的
OAuth2RestTemplate
时,依赖项注入引擎会引发
NoSuchBeanDefinitionException
异常。例如,以下情况会引发异常:

@LoadBalanced
@Autowired
@Qualifier("MyOAuthRestTemplate")
private OAuth2RestTemplate restTemplate;

当我删除
@LoadBalanced
时,一切正常。
@LoadBalanced
有什么问题?我是否需要任何其他配置(我已经有了
@enableurekaclient
)?

我找到了一个解决方法。问题是我误解了
@LoadBalanced
注释。这只是自动创建的负载平衡
restemplate
bean的限定符,它不会围绕注释的
restemplate
创建用于注入负载平衡功能的代理

看到这一点后,我修改了我的
OAuth2RestTemplate
bean定义如下,它解决了这个问题

@Bean
@Qualifier("MyOAuthRestTemplate")
public OAuth2RestTemplate restTemplate(RestTemplateCustomizer customizer) {
    OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(this.resource);
    customizer.customize(restTemplate);
    return restTemplate;
}

我在SpringCloud中使用@LoadBalanced和restTemplate,并在幕后使用ribbon

在bean定义中添加@LoadBalanced会起作用 像这样:

我在班上有

@Autowired  
@LoadBalanced  
@Qualifier("bookRepositoryServiceRestTemplate") private RestTemplate bookRepositoryServiceRestTemplate;
在我的配置类中,我有:

@Configuration
public class ServiceConfig {

    @Bean
    @LoadBalanced
    public RestTemplate bookRepositoryServiceRestTemplate(SpringClientFactory clientFactory, LoadBalancerClient loadBalancer){
        RibbonClientHttpRequestFactory ribbonClientHttpRequestFactory = new RibbonClientHttpRequestFactory(clientFactory,loadBalancer);
        return new RestTemplate(ribbonClientHttpRequestFactory);
    }
    ....

}
这对我有用


我希望这能有所帮助

你不需要
@Qualifier(“bookRepositoryServiceRestTemplate”)
。是的,我知道这只是我的习惯