«1. Введение

В этом кратком руководстве мы рассмотрим, как настроить bean-компонент Spring RestTemplate.

Давайте начнем с обсуждения трех основных типов конфигурации:

    использование RestTemplateBuilder по умолчанию использование RestTemplateCustomizer создание собственного RestTemplateBuilder

Чтобы иметь возможность легко протестировать это, следуйте руководству по настройке простого Spring Загрузочное приложение.

2. Конфигурация с использованием RestTemplateBuilder по умолчанию

Чтобы настроить RestTemplate таким образом, нам нужно внедрить bean-компонент RestTemplateBuilder по умолчанию, предоставленный Spring Boot, в наши классы:

private RestTemplate restTemplate;

@Autowired
public HelloController(RestTemplateBuilder builder) {
    this.restTemplate = builder.build();
}

Bean-компонент RestTemplate, созданный с помощью этого метода, имеет его объем ограничен классом, в котором мы его строим.

3. Конфигурация с использованием RestTemplateCustomizer

При таком подходе мы можем создать дополнительную настройку для всего приложения.

Это немного более сложный подход. Для этого нам нужно создать класс, реализующий RestTemplateCustomizer, и определить его как bean-компонент:

public class CustomRestTemplateCustomizer implements RestTemplateCustomizer {
    @Override
    public void customize(RestTemplate restTemplate) {
        restTemplate.getInterceptors().add(new CustomClientHttpRequestInterceptor());
    }
}

Перехватчик CustomClientHttpRequestInterceptor выполняет базовую регистрацию запроса:

public class CustomClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
    private static Logger LOGGER = LoggerFactory
      .getLogger(CustomClientHttpRequestInterceptor.class);

    @Override
    public ClientHttpResponse intercept(
      HttpRequest request, byte[] body, 
      ClientHttpRequestExecution execution) throws IOException {
 
        logRequestDetails(request);
        return execution.execute(request, body);
    }
    private void logRequestDetails(HttpRequest request) {
        LOGGER.info("Headers: {}", request.getHeaders());
        LOGGER.info("Request Method: {}", request.getMethod());
        LOGGER.info("Request URI: {}", request.getURI());
    }
}

Теперь мы определяем CustomRestTemplateCustomizer как bean-компонент. в классе конфигурации или в нашем классе приложения Spring Boot:

@Bean
public CustomRestTemplateCustomizer customRestTemplateCustomizer() {
    return new CustomRestTemplateCustomizer();
}

В этой конфигурации каждый RestTemplate, который мы будем использовать в нашем приложении, будет иметь установленный на нем настраиваемый перехватчик.

4. Настройка путем создания нашего собственного RestTemplateBuilder

Это самый экстремальный подход к настройке RestTemplate. Он отключает автоматическую настройку RestTemplateBuilder по умолчанию, поэтому нам нужно определить его самостоятельно:

@Bean
@DependsOn(value = {"customRestTemplateCustomizer"})
public RestTemplateBuilder restTemplateBuilder() {
    return new RestTemplateBuilder(customRestTemplateCustomizer());
}

После этого мы можем внедрить пользовательский конструктор в наши классы, как мы сделали бы с RestTemplateBuilder по умолчанию, и создать RestTemplate как обычно:

private RestTemplate restTemplate;

@Autowired
public HelloController(RestTemplateBuilder builder) {
    this.restTemplate = builder.build();
}

5. Заключение

Мы увидели, как настроить RestTemplate с помощью RestTemplateBuilder по умолчанию, создать собственный RestTemplateBuilder или использовать bean-компонент RestTemplateCustomizer.

Как всегда, полную кодовую базу для этого примера можно найти в нашем репозитории GitHub.