无法注入LoadBalanced带注释的OAuth2RestTemplate

时间:2016-01-20 19:45:16

标签: spring spring-boot spring-cloud spring-oauth2 spring-cloud-connectors

我正在使用Spring Cloud Angel.SR4。我用于创建OAuth2RestTemplate bean的Configuration类如下:

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

    public OAuthClientConfiguration() {
    }

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

此配置完全正常,因为我在假设RestTemplate中使用此RequestInterceptor来向假冒请求注入访问令牌。问题是,当我使用OAuth2RestTemplate注释自动装配的@LoadBalanced时,依赖注入引擎会引发NoSuchBeanDefinitionException异常。例如,以下内容会引发异常:

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

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

2 个答案:

答案 0 :(得分:3)

我找到了解决方法。问题是我误解了@LoadBalanced注释。这只是自动创建的负载平衡RestTemplate bean的限定符,并且它不会在注释RestTemplate周围创建代理以注入负载平衡功能。

看到这个https://github.com/spring-cloud/spring-cloud-commons/blob/v1.0.3.RELEASE/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/LoadBalancerAutoConfiguration.java之后,我修改了我的OAuth2RestTemplate bean定义,如下所示,它解决了这个问题。

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

答案 1 :(得分:1)

我在Spring云中使用带有restTemplate的@LoadBalanced和幕后功能。

在它工作的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);
    }
    ....

}

这对我有用

我希望这可以帮助