代码之家  ›  专栏  ›  技术社区  ›  Sahil Chhabra

在SpringBoot 2.1.x中使用RestTemplateBuilder的RequestFactory的自定义RestTemplate与1.5.x版本不向后兼容

  •  3
  • Sahil Chhabra  · 技术社区  · 6 年前

    弹簧套1.5.x ,我正在创建一个自定义 RestTemplate 如下所示:

    @Bean
      public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
        PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
        poolingConnectionManager.setMaxTotal(restTemplateProps.getMaxConnectionsPerPool());
        poolingConnectionManager.setDefaultMaxPerRoute(restTemplateProps.getMaxDefaultConnectionPerRoute());
        CloseableHttpClient client = HttpClientBuilder.create().setConnectionManager(poolingConnectionManager).build();
        HttpComponentsClientHttpRequestFactory clientHttpRequestFactory =
            new HttpComponentsClientHttpRequestFactory(client);
        clientHttpRequestFactory.setConnectTimeout(restTemplateProps.getConnectionTimeout());
        clientHttpRequestFactory.setReadTimeout(restTemplateProps.getSocketTimeout());
        return restTemplateBuilder.requestFactory(clientHttpRequestFactory).build();
      }
    

    但是,在迁移到 弹簧套2.1.x 以上代码不编译。看起来像 requestFactory 不需要 HttpComponentsClientHttpRequestFactory 作为输入参数。

    有人能建议我如何在SpringBoot2.1.x中实现上述代码吗?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Sahil Chhabra    6 年前

    在深入挖掘 RestTemplateBuilder 属于 弹簧套2.1.x ,我发现他们已经移除了这个方法。 requestFactory(ClientHttpRequestFactory requestFactory) . 这意味着你不能再注射 ClientHttpRequestFactory 对象进入 requestFactory 方法。

    但是,它接受 Supplier<ClientHttpRequestFactory> 作为现在的输入。所以你只需要注册一个 HttpComponentsClientHttpRequestFactory 在Spring上下文中bean并传递 ClientHttpRequestFactorySupplier 请求工厂 方法。供应商将自动检测 httpcomponentsClienthttpRequestFactory 并返回所需的resttemplate。

    请参阅以下代码:

    @Bean
      public HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory() {
        PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
        poolingConnectionManager.setMaxTotal(restTemplateProps.getMaxConnectionsPerPool());
        poolingConnectionManager.setDefaultMaxPerRoute(restTemplateProps.getMaxDefaultConnectionPerRoute());
        CloseableHttpClient client = HttpClientBuilder.create().setConnectionManager(poolingConnectionManager).build();
        HttpComponentsClientHttpRequestFactory clientHttpRequestFactory =
            new HttpComponentsClientHttpRequestFactory(client);
        clientHttpRequestFactory.setConnectTimeout(restTemplateProps.getConnectionTimeout());
        clientHttpRequestFactory.setReadTimeout(restTemplateProps.getSocketTimeout());
        return clientHttpRequestFactory;
      }
    
      @Bean
      public RestTemplate authRestTemplate(RestTemplateBuilder restTemplateBuilder) {
        return restTemplateBuilder.requestFactory(new ClientHttpRequestFactorySupplier()).build();
      }
    

    对于那些对SpringBoot 2.1.x中的restTemplateBuilder所做的所有更改感兴趣的用户,请参阅 this .