Spring mvc RestTemplateBuilderbean

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

我的应用程序与不同的rest端点接口,每个端点都需要一个专门的RestTemplate对象。我正在使用RestTemplateBuilder创建每个RestTemplate对象。克隆spring boot提供的RestTemplateBuilder对象并进行更改可以吗

@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的。