Не удается внедрить аннотированный LoadBalanced OAuth2RestTemplate

Я использую Spring Cloud Angel.SR4. Мой класс конфигурации для создания bean-компонента OAuth2RestTemplate выглядит следующим образом:

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

    public OAuthClientConfiguration() {
    }

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

Эта конфигурация полностью удобна, так как я использую этот RestTemplate в Feign RequestInterceptor для внедрения токенов доступа в запросы feign. Проблема в том, что когда я аннотирую автосвязанный OAuth2RestTemplate с помощью @LoadBalanced, механизм внедрения зависимостей вызывает исключение NoSuchBeanDefinitionException. Например, следующее вызовет исключение:

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

и когда я удаляю @LoadBalanced, все работает нормально. Что не так с @LoadBalanced? Нужны ли дополнительные настройки (у меня уже есть @EnableEurekaClient)?


person Armin Balalaie    schedule 20.01.2016    source источник


Ответы (2)


Я нашел обходной путь. Проблема была в том, что я неправильно понял аннотацию @LoadBalanced. Это просто квалификатор для автоматически созданного компонента RestTemplate с балансировкой нагрузки, и он не будет создавать прокси вокруг аннотированного RestTemplate для внедрения возможности балансировки нагрузки.

Увидев это https://github.com/spring-cloud/spring-cloud-commons/blob/v1.0.3.RELEASE/spring-cloud-commons/src/main/java/org/springframework/облако/клиент/loadbalancer/LoadBalancerAutoConfiguration.java, я изменил свое определение компонента OAuth2RestTemplate следующим образом, и это решило проблему.

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

Я использовал @LoadBalanced с restTemplate в весеннем облаке с лентой за кулисами.

добавление @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);
    }
    ....

}

это работает для меня

Я надеюсь, что это может помочь

person Valerio Vaudi    schedule 07.03.2016
comment
Вам не нужно @Qualifier("bookRepositoryServiceRestTemplate"). - person spencergibb; 08.03.2016
comment
Да, я знаю, это просто моя привычка - person Valerio Vaudi; 08.03.2016