1
votes

In RestTemplate I have a custom interceptor which will log some request response details and saves to database.

my custom Interceptor:

import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;

@Component
public class LogServices implements ClientHttpRequestInterceptor {
    
    @Override
    public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {
        final String uri = request.getURI().toString();
        final ClientHttpResponse response = execution.execute(request, body);
        //log request response details and save to database
        return response;

RestTemplate bean configuration in springboot:

@Bean
public RestTemplate restTemplate(final RestTemplateBuilder restTemplateBuilder) {
  return restTemplateBuilder
  .setConnectTimeout(Duration.ofMillis(connectTimeout))
  .setReadTimeout(Duration.ofMillis(readTimeout))
  .build();

Add the interceptor to restTemplate bean:

@Configuration
public class LogInterceptorConfiguration {
  @Autowired
  public void configureLogger(final RestTemplate restTemplate, final LogServices logServices) {
    final var interceptors = restTemplate.getInterceptors();
    interceptors.add(logServices);
    restTemplate.setInterceptors(interceptors);
  }

How can I add this interceptor to FeignClient?

In application.yml:

feign:
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
        request-interceptors[0]: com.api.restclient.InterceptorOne
        request-interceptors[1]: com.api.log.LogServices

InterceptorOne which adds a header to every request in feign client:

@Configuration
public class InterceptorOne implements RequestInterceptor {
  @Override
  public void apply(RequestTemplate requestTemplate) {
     requestTemplate.header("some-header", "value");
  }

But I cannot add the LogServices interceptor since it does not work due to the error cannot be cast to class feign.RequestInterceptor

My guess is that the interceptor I am trying to add is a generic interceptor and not specifically request interceptor. So I want to know how do I add a generic interceptor to FeignClient similar to RestTemplate

1

1 Answers

0
votes

You can add multiple interceptors as follows

feign:
  client:
    config:
      feignName:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: full
        errorDecoder: com.example.SimpleErrorDecoder
        retryer: com.example.SimpleRetryer
        requestInterceptors:
          - com.example.InterceptorOne
          - com.example.LogServices
        decode404: false
        encoder: com.example.SimpleEncoder
        decoder: com.example.SimpleDecoder
        contract: com.example.SimpleContract