
Baeldung Pro comes with both absolutely No-Ads as well as finally with Dark Mode, for a clean learning experience:
Once the early-adopter seats are all used, the price will go up and stay at $33/year.
Last updated: April 17, 2025
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:
To be able to test this easily, please follow the guide on how to set up a simple Spring Boot application.
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.
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.
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();
}
We’ve seen how to configure a RestTemplate with the default RestTemplateBuilder, building our own RestTemplateBuilder, or using a RestTemplateCustomizer bean.