如何在RestTemplate(Spring)中最后执行一个ClientHttpRequestInterceptor

时间:2018-09-27 12:56:47

标签: java spring spring-boot resttemplate

我将多个ClientHttpRequestInterceptor设置为我的RestTemplate(CommonRestTemplateBuilder)的常用配置,其中之一是LogRequestInterceptor。

问题是,当我在新的@Configuration中添加新的ClientHttpRequestInterceptor时,在其中以commonRestTemplateBuilder为基础创建另一个RestTemplate时,日志记录的拦截器在新的拦截器之前执行。

这里的问题是新的拦截器添加了未反映在日志中的标头。

可以给拦截器下达命令吗?

这是代码:

/**
 * Configures the common rest template builder for building {@link RestTemplate}
 */
@Bean
public RestTemplateBuilder commonRestTemplateBuilder(HttpClient httpClient) {

    return new RestTemplateBuilder()
            .requestFactory(() -> {
                //Use Apache Http Client request factory
                HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
                //Use the apache caching http client
                requestFactory.setHttpClient(httpClient);
                //Use buffering client for debugging (get the body of the request)
                return new BufferingClientHttpRequestFactory(requestFactory);
            })
            .customizers()
            .interceptors(
                    //For adding common headers
                    new AddCommonsHeadersRequestInterceptor(),
                    //For logging the requests
                    new LogRequestInterceptor());
}

然后在另一堂课中

/**
 * Configures the {@link RestTemplate} for {@link CompanyAClient}
 * using as a base the {@link CommonRestTemplateConfiguration}.
 */
@Bean
public RestTemplate companyARestTemplate() {

    return commonRestTemplateBuilder
            .rootUri("http://companyA.com/api")
            .additionalInterceptors(new AddCompanyAHeadersRequestInterceptor())
            .build();
}

非常感谢您。

1 个答案:

答案 0 :(得分:0)

当然可以。从Spring 5开始,拦截器使用AnnotationAwareOrderComparator进行排序。从您的角度来看,您只需在拦截器上添加注解@Order或@Priority:

@Order(1)
public class FirstInterceptor implements ClientHttpRequestInterceptor {
...
}

@Order(2)
public class SecondInterceptor implements ClientHttpRequestInterceptor {
...
}