当前位置: 首页 > 知识库问答 >
问题:

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

鄢子平
2023-03-14

我有多个ClientHttpRequestInterceptor设置为我的RestTemplate(CommonRestTemplateBuilder)的公共配置,其中一个是LogRequestInterceptor。

问题是,当我在一个新的@配置中添加一个新的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个答案

拓拔霄
2023-03-14

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

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

@Order(2)
public class SecondInterceptor implements ClientHttpRequestInterceptor {
...
}
 类似资料:
  • 问题内容: 我正在使用RestTemplate来调用Web服务。 如果此操作无法返回用户ID,我只会返回null,但不知道为什么。如何将实际的XML响应输出到日志? 问题答案: 根据所使用的建立HTTP连接的方法,您可以查看在实际HTTP连接类中打开日志记录。 例如,如果您使用Commons HttpClient,则可以设置 commons- httpclient项目在其日志记录做法的文档中有一整

  • 我试图使用下面的代码模拟方法,但我得到了异常,而且我是单元测试的新手

  • 问题内容: 伙计们,我想在mysql中使用解析函数滞后。在Oracle中受支持,但在Mysql中无法做到。那么有人可以帮助我如何在Mysql中执行滞后运算吗?例如 我想使用滞后函数,以便我的输出如下 Mysql支持滞后功能吗??? 问题答案: 您可以使用用户变量来模拟它: 看到它在工作sqlfiddle直播 在这里,您可以初始化变量。这与在编写查询之前编写内容相同。 那么这些语句在select子句

  • 问题内容: 我想做的是 找出重定向之后的最后一个/最终URL是什么 。 我不希望使用cURL。 我想坚持使用纯PHP(流包装器)。 现在,我有一个URL(比如说http://domain.test),并且我使用get_headers()从该页面获取特定的标题。get_headers也将返回多个标题(请参见下面的 Edit )。有没有办法使用这些标头来构建最终URL?还是有一个PHP函数可以自动执行

  • 我使用的是1.3.3.Spring Boot的发行版。