无法注入 LoadBalanced 注释的 OAuth2RestTemplate
Cannot inject LoadBalanced annotated OAuth2RestTemplate
我正在使用 Spring Cloud Angel.SR4。我用于创建 OAuth2RestTemplate
bean 的配置 class 如下:
@Configuration
public class OAuthClientConfiguration {
@Autowired
private MyClientCredentialsResourceDetails resource;
public OAuthClientConfiguration() {
}
@Bean
@Qualifier("MyOAuthRestTemplate")
public OAuth2RestTemplate restTemplate() {
return new OAuth2RestTemplate(this.resource);
}
}
这个配置完全没问题,因为我在 Feign RequestInterceptor
中使用这个 RestTemplate
来向 Feign 请求注入访问令牌。问题是,当我用 @LoadBalanced
注释自动装配的 OAuth2RestTemplate
时,依赖注入引擎会引发 NoSuchBeanDefinitionException
异常。例如,以下将引发异常:
@LoadBalanced
@Autowired
@Qualifier("MyOAuthRestTemplate")
private OAuth2RestTemplate restTemplate;
当我删除 @LoadBalanced
时,一切正常。 @LoadBalanced
有什么问题?我是否需要任何其他配置(我已经有 @EnableEurekaClient
)?
我找到了解决方法。问题是我误解了 @LoadBalanced
注释。这只是 auto-created load-balanced 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;
}
我在 spring 云中使用带 restTemplate 的 @LoadBalanced 和幕后功能区。
在 bean 定义中添加 @LoadBalanced 它起作用
像这样:
在我的 class 我有
@Autowired
@LoadBalanced
@Qualifier("bookRepositoryServiceRestTemplate") private RestTemplate bookRepositoryServiceRestTemplate;
在我的配置中 class 我有:
@Configuration
public class ServiceConfig {
@Bean
@LoadBalanced
public RestTemplate bookRepositoryServiceRestTemplate(SpringClientFactory clientFactory, LoadBalancerClient loadBalancer){
RibbonClientHttpRequestFactory ribbonClientHttpRequestFactory = new RibbonClientHttpRequestFactory(clientFactory,loadBalancer);
return new RestTemplate(ribbonClientHttpRequestFactory);
}
....
}
这对我有用
希望对您有所帮助
我正在使用 Spring Cloud Angel.SR4。我用于创建 OAuth2RestTemplate
bean 的配置 class 如下:
@Configuration
public class OAuthClientConfiguration {
@Autowired
private MyClientCredentialsResourceDetails resource;
public OAuthClientConfiguration() {
}
@Bean
@Qualifier("MyOAuthRestTemplate")
public OAuth2RestTemplate restTemplate() {
return new OAuth2RestTemplate(this.resource);
}
}
这个配置完全没问题,因为我在 Feign RequestInterceptor
中使用这个 RestTemplate
来向 Feign 请求注入访问令牌。问题是,当我用 @LoadBalanced
注释自动装配的 OAuth2RestTemplate
时,依赖注入引擎会引发 NoSuchBeanDefinitionException
异常。例如,以下将引发异常:
@LoadBalanced
@Autowired
@Qualifier("MyOAuthRestTemplate")
private OAuth2RestTemplate restTemplate;
当我删除 @LoadBalanced
时,一切正常。 @LoadBalanced
有什么问题?我是否需要任何其他配置(我已经有 @EnableEurekaClient
)?
我找到了解决方法。问题是我误解了 @LoadBalanced
注释。这只是 auto-created load-balanced 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;
}
我在 spring 云中使用带 restTemplate 的 @LoadBalanced 和幕后功能区。
在 bean 定义中添加 @LoadBalanced 它起作用 像这样:
在我的 class 我有
@Autowired
@LoadBalanced
@Qualifier("bookRepositoryServiceRestTemplate") private RestTemplate bookRepositoryServiceRestTemplate;
在我的配置中 class 我有:
@Configuration
public class ServiceConfig {
@Bean
@LoadBalanced
public RestTemplate bookRepositoryServiceRestTemplate(SpringClientFactory clientFactory, LoadBalancerClient loadBalancer){
RibbonClientHttpRequestFactory ribbonClientHttpRequestFactory = new RibbonClientHttpRequestFactory(clientFactory,loadBalancer);
return new RestTemplate(ribbonClientHttpRequestFactory);
}
....
}
这对我有用
希望对您有所帮助