zoukankan      html  css  js  c++  java
  • spring restTemplate intercepters 配置失效

    需要使用restTemplate做一些对网络的操作,在springboot项目中,配置了一下

        @Bean
        public RestTemplate restTemplate(RestTemplateBuilder builder) {
            builder.additionalInterceptors(requestInterceptor());
            return builder.build();
        }
    
            @Bean
        public ClientHttpRequestInterceptor requestInterceptor() {
            return (request, body, execution) -> {
                // 测试代码

                 request.getHeaders().forEach((k, v) -> {
                     System.out.println("Header: " + k + " : " + v);
                 });

                 return execution.execute(request, body);

            };
        }        

    运行后,但是配置的拦截器始终没有生效。没有头信息的输出。

    于是找原因,在RestTemplateBuilder中看到源码是这样的:

        /**
         * Add additional {@link ClientHttpRequestInterceptor ClientHttpRequestInterceptors}
         * that should be used with the {@link RestTemplate}.
         * @param interceptors the interceptors to add
         * @return a new builder instance
         * @since 1.4.1
         * @see #interceptors(ClientHttpRequestInterceptor...)
         */
        public RestTemplateBuilder additionalInterceptors(Collection<? extends ClientHttpRequestInterceptor> interceptors) {
            Assert.notNull(interceptors, "interceptors must not be null");
            return new RestTemplateBuilder(this.requestFactoryCustomizer, this.detectRequestFactory, this.rootUri,
                    this.messageConverters, append(this.interceptors, interceptors), this.requestFactory,
                    this.uriTemplateHandler, this.errorHandler, this.basicAuthentication, this.defaultHeaders,
                    this.customizers, this.requestCustomizers);
        }

    原来是这里的问题:

    return new RestTemplateBuilder...

    spring注入的builder示例为A:


    public RestTemplate restTemplate(RestTemplateBuilder builder) {

     

    返回的是一个新示例,那么拦截器添加到的是到新实例B(

    return new RestTemplateBuilder..

    ),在方法注释上有写:return a new builder instance。

    往下走继续builder.build()就是使用A在build,而不是B去build。

    不细看,不链式操作的情况下~真的有点容易出错。

  • 相关阅读:
    非域账户如何连接SQL Server Analysis Service
    Ranet.UILibrary.OLAP
    给Silverlight项目Ranet.UILibrary.OLAP添加客户端调试功能
    编译及安装QCA类库
    关于软件生态环境
    Windows7中操作mysql数据库
    介绍自己
    VS2008技巧收集
    .NET开发不可错过的25款必备工具
    如何做搜索引擎优化(SEO)
  • 原文地址:https://www.cnblogs.com/neoliu6/p/12889173.html
Copyright © 2011-2022 走看看