Configure a RestTemplate with RestTemplateBuilder

1. Introduction

In this quick tutorial, we’re going to look at how to configure a Spring RestTemplate bean.

Let’s start by discussing the three main configuration types:

  • using the default RestTemplateBuilder
  • using a RestTemplateCustomizer
  • creating our own RestTemplateBuilder

To be able to test this easily, please follow the guide on how to set up a simple Spring Boot application.

2. Configuration Using the Default RestTemplateBuilder

To configure a RestTemplate this way, we need to inject the default RestTemplateBuilder bean provided by Spring Boot into our classes:

private RestTemplate restTemplate;

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

The RestTemplate bean created with this method has its scope limited to the class in which we build it.

3. Configuration Using a RestTemplateCustomizer

With this approach, we can create an application-wide, additive customization.

This is a slightly more complicated approach. For this we need to create a class that implements RestTemplateCustomizer, and define it as a bean:

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

The CustomClientHttpRequestInterceptor interceptor is doing basic logging of the request:

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

Now, we define CustomRestTemplateCustomizer as a bean in a configuration class or in our Spring Boot application class:

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

With this configuration, every RestTemplate that we’ll use in our application will have the custom interceptor set on it.

4. Configuration by Creating Our Own RestTemplateBuilder

This is the most extreme approach to customizing a RestTemplate. It disables the default auto-configuration of RestTemplateBuilder, so we need to define it ourselves:

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

After this, we can inject the custom builder into our classes like we’d do with a default RestTemplateBuilder and create a RestTemplate as usual:

private RestTemplate restTemplate;

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

5. Conclusion

We’ve seen how to configure a RestTemplate with the default RestTemplateBuilder, building our own RestTemplateBuilder, or using a RestTemplateCustomizer bean.

As always, the full codebase for this example can be found in our GitHub repository.

Related posts:

Java Web Services – JAX-WS – SOAP
Checking for Empty or Blank Strings in Java
Generating Random Dates in Java
Java Program to Implement HashTable API
Converting a Stack Trace to a String in Java
Guide to the Synchronized Keyword in Java
Phương thức tham chiếu trong Java 8 – Method References
Spring Boot - Creating Docker Image
Properties with Spring and Spring Boot
Các kiểu dữ liệu trong java
Java Program to Perform Postorder Non-Recursive Traversal of a Given Binary Tree
Java Map With Case-Insensitive Keys
Display Auto-Configuration Report in Spring Boot
REST Web service: Basic Authentication trong Jersey 2.x
Tips for dealing with HTTP-related problems
Base64 encoding và decoding trong Java 8
HttpClient Timeout
Giới thiệu Swagger – Công cụ document cho RESTfull APIs
Introduction to Apache Commons Text
Java Program to Implement Gift Wrapping Algorithm in Two Dimensions
Java Program to Implement the Hill Cypher
An Intro to Spring Cloud Contract
Java Program to Sort an Array of 10 Elements Using Heap Sort Algorithm
Java Program to Generate All Possible Combinations of a Given List of Numbers
Remove All Occurrences of a Specific Value from a List
Java Program to Implement Binomial Tree
4 tính chất của lập trình hướng đối tượng trong Java
Java Program to Find the Peak Element of an Array O(n) time (Naive Method)
Converting Iterator to List
Generating Random Numbers in a Range in Java
Java Program to Find Nearest Neighbor Using Linear Search
Explain about URL and HTTPS protocol