你的解决方案不是很好,因为
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@LoadBalanced
public KeycloakRestTemplate keycloakRestTemplate(
KeycloakClientRequestFactory keycloakClientRequestFactory,
LoadBalancerInterceptor interceptor) {
KeycloakRestTemplate result = new KeycloakRestTemplate(
keycloakClientRequestFactory);
// Add the interceptor for load balancing
result.getInterceptors().add(interceptor);
return result;
}
没有工作,因为你有例外
The dependencies of some of the beans in the application context form a cycle:
...
┌─────┐
| keycloakRestTemplate defined in class path resource [...]
↑ ↓
| ribbonInterceptor defined in class path resource [org/springframework/cloud/client/loadbalancer/LoadBalancerAutoConfiguration$LoadBalancerInterceptorConfig.class]
↑ ↓
| org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration (field private java.util.List org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration.restTemplates)
└─────┘
你必须做什么?
@Bean
@LoadBalanced
public KeycloakRestTemplate keycloakRestTemplate(
KeycloakClientRequestFactory keycloakClientRequestFactory) {
return new KeycloakRestTemplate(keycloakClientRequestFactory);
}
没有@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)那么你会得到你可以像这样使用的单例
@Autowired
protected KeycloakRestTemplate restTemplate;
或者你可以像原型一样定义restTemplate
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@LoadBalanced
public KeycloakRestTemplate keycloakRestTemplate(
KeycloakClientRequestFactory keycloakClientRequestFactory) {
return new KeycloakRestTemplate(keycloakClientRequestFactory);
}
然后像这样使用
@Autowired
@LoadBalanced
protected KeycloakRestTemplate restTemplate;
编辑:由于循环问题,Xtreme Biker 的解决方案无法与 SpringBoot 2 和 Keycloak 6 一起使用,我的第一个提议不是线程/会话保存,第二个提议不起作用,因为将在运行 @LoadBalanced 和restTemplate之前创建wchich 是基于原型创建的,没有设置拦截器:|