Spring mvc RestTemplateBuilderbean
我的应用程序与不同的rest端点接口,每个端点都需要一个专门的RestTemplate对象。我正在使用RestTemplateBuilder创建每个RestTemplate对象。克隆spring boot提供的RestTemplateBuilder对象并进行更改可以吗Spring mvc RestTemplateBuilderbean,spring-mvc,spring-boot,resttemplate,Spring Mvc,Spring Boot,Resttemplate,我的应用程序与不同的rest端点接口,每个端点都需要一个专门的RestTemplate对象。我正在使用RestTemplateBuilder创建每个RestTemplate对象。克隆spring boot提供的RestTemplateBuilder对象并进行更改可以吗 @Configuration public class Config { @Bean public RestTemplate googleRestTemplate(RestTemplateBuilder restTemplateB
@Configuration
public class Config {
@Bean
public RestTemplate googleRestTemplate(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder.basicAuthorization("user", "pwd123").build();
}
@Bean
public RestTemplate twitterRestTemplate(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder.setConnectTimeout(5000).build();
}
}
在这里,我将单例构建器bean注入到这两个bean方法中。我试图克服的问题是同一个构建器对象的变异。在我的示例中,我的第二个rest模板不需要基本授权,但我无意中获得了它。为什么要这样做?
添加config
类:
@Configuration
class Config {
@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder.build();
}
}
在您的控制器内
将消耗您的终点:
@Autowired
RestTemplate restTempl;
@RequestMapping(value = "/consume", method = RequestMethod.POST)
public void samplePostMethod() {
HttpHeaders headers = new HttpHeaders();
HttpEntity<String> entity = new HttpEntity<String>("Data", headers);
RequestDetails requestDetails = new RequestDetails("http://localhost:8082/endpoint1", HttpMethod.POST);
ResponseEntity<String> response = restTempl.exchange(requestDetails.getUrl(), requestDetails.getRequestType(),
entity, String.class);
RequestDetails requestDetailss = new RequestDetails("http://localhost:8082/endpoint2", HttpMethod.POST);
ResponseEntity<String> responses = restTempl.exchange(requestDetailss.getUrl(), requestDetailss.getRequestType(),
entity, String.class);
logger.log("{} {}", response, responses);
return response.getBody();
}
@Autowired
RestTemplate restTempl;
@RequestMapping(value=“/consume”,method=RequestMethod.POST)
public void samplePostMethod(){
HttpHeaders=新的HttpHeaders();
HttpEntity=新的HttpEntity(“数据”,标题);
RequestDetails RequestDetails=新的RequestDetails(“http://localhost:8082/endpoint1“,HttpMethod.POST);
ResponseEntity response=restTempl.exchange(requestDetails.getUrl(),requestDetails.getRequestType(),
实体、字符串、类);
RequestDetails RequestDetails=新的RequestDetails(“http://localhost:8082/endpoint2“,HttpMethod.POST);
ResponseEntity responses=restTempl.exchange(requestDetails.getUrl(),requestDetails.getRequestType(),
实体、字符串、类);
logger.log(“{}{}”,响应,响应);
返回response.getBody();
}
您可以使用下面的@Qualifier
注释来区分RestTemplates
@Configuration
public class Config {
@Bean
@Qualifier("googleRestTemplate")
public RestTemplate googleRestTemplate(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder.basicAuthorization("user", "pwd123").build();
}
@Bean
@Qualifier("twitterRestTemplate")
public RestTemplate twitterRestTemplate(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder.setConnectTimeout(5000).build();
}
}
然后,您可以将控制器中的任何RESTTemplatebean与这些@qualifier一起使用
@Autowired
@Qualifier("googleRestTemplate")
private RestTemplate restTemplate;
我已经添加了一个代码片段和关于这个问题的解释。如何将bean的范围从单例更改为请求呢。请参阅上面的更新,但是如果需要使用对应用程序的相同请求调用这些端点,则上述解决方案将无法工作。我在等待你的答复。我的想法是在两个bean方法中克隆resttemplatebuilder,使原始的生成器保持原始。不,你不能这样做。如果需要自定义,可以使用
restemplatecustomizer
,而无需这样做。根据文档,每次调用restemplatebuilder
的方法都会返回一个新的restemplatebuilder
实例。所以这基本上意味着,你应该有一个谷歌和一个twitter的实例。我怀疑你连第二个豆子都不叫。你能通过添加一些记录器来检查吗?谢谢。我知道区分不同rest模板bean的限定符——我的问题是关于rest模板生成器bean的。