我将多个 ClientHttpRequestInterceptor 设置为 RestTemplate (CommonRestTemplateBuilder) 的常用配置,其中之一是 LogRequestInterceptor。
问题是当我在一个新的@Configuration 中添加一个新的ClientHttpRequestInterceptor 时,我在其中创建另一个RestTemplate 使用commonRestTemplateBuilder 作为基础,用于记录的拦截器在新拦截器之前执行。
这里的问题是新的拦截器添加了没有反射(reflect)在日志中的 header 。
是否可以给拦截器下达命令?
这是代码:
/**
* 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();
}
非常感谢。
最佳答案
当然,这是可能的。从 Spring 5 开始,拦截器使用 AnnotationAwareOrderComparator 排序.在您这边,您只需在拦截器上添加注解@Order 或@Priority:
@Order(1)
public class FirstInterceptor implements ClientHttpRequestInterceptor {
...
}
@Order(2)
public class SecondInterceptor implements ClientHttpRequestInterceptor {
...
}
关于java - 如何在 RestTemplate (Spring) 中最后执行 ClientHttpRequestInterceptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52537550/