【问题标题】:How to execute a ClientHttpRequestInterceptor last in RestTemplate (Spring)如何在 RestTemplate (Spring) 中最后执行 ClientHttpRequestInterceptor
【发布时间】:2018-09-27 12:56:47
【问题描述】:

我设置了多个 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();
}

非常感谢。

【问题讨论】:

    标签: java spring spring-boot resttemplate


    【解决方案1】:

    当然,这是可能的。从 Spring 5 开始,拦截器使用AnnotationAwareOrderComparator 进行排序。在您这边,您只需在拦截器上添加注释 @Order 或 @Priority:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      相关资源
      最近更新 更多