我将多个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();
}
非常感谢您。
答案 0 :(得分:0)
当然可以。从Spring 5开始,拦截器使用AnnotationAwareOrderComparator进行排序。从您的角度来看,您只需在拦截器上添加注解@Order或@Priority:
@Order(1)
public class FirstInterceptor implements ClientHttpRequestInterceptor {
...
}
@Order(2)
public class SecondInterceptor implements ClientHttpRequestInterceptor {
...
}