RestTemplateBuilder bean - PullRequest
       18

RestTemplateBuilder bean

0 голосов
/ 26 июня 2018

Мое приложение взаимодействует с разными конечными точками покоя, и для каждого из них требуется специальный объект RestTemplate. Я использую RestTemplateBuilder для создания каждого из объектов RestTemplate. Можно ли клонировать объект 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-компонент-синглтон, который вводится в оба метода. Проблема, которую я пытаюсь преодолеть, заключается в том, что мутирует один и тот же объект-строитель. В моем примере мой второй шаблон отдыха не требует базовой авторизации, но я случайно получил его.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Вы можете различать ваши RestTemplates, используя @Qualifier аннотацию, как показано ниже.

@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();
  }
}

Затем вы можете использовать любой из бинов RestTemplate в своих контроллерах с этими @ Qualifiers.

@Autowired
@Qualifier("googleRestTemplate")
private RestTemplate restTemplate;
0 голосов
/ 27 июня 2018

Зачем ты это делаешь? Добавить config класс:

@Configuration
class Config {
    @Bean
    @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
    RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
        return restTemplateBuilder.build();
    }
}

внутри вашего Controller, который будет потреблять ваши конечные точки:

@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();
}
...