java - 如何在 RestTemplate (Spring) 中最后执行 ClientHttpRequestInterceptor

标签 java spring spring-boot resttemplate

我将多个 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/

相关文章:

spring - 在cloudfoundry和@Value注释中处理属性的两个不同值(云和默认值)

spring - InfluxDB docker镜像不适用于我的Spring Boot应用程序镜像

java - 使用 Spring Boot 和 RestTemplate 使用嵌套的 JSON 数组

java - 使用 null 而不是默认值可以获得性能提升?

java - Spring 将动态生成的值放入占位符中

java - 使用 Java Spring JPA 和 CRUD 更新数据库记录

spring-security - Spring 启动测试: Spring Security with custom auth provider not visible on springsecurityfilterchain

java - 错误 : class X is public should be declared in a file named X. java

java - Android 应用服务器的行业标准是什么?

java - 将 map 设置为 Spring bean