Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在SpringBoot 2.1.x中使用RestTemplateBuilder的requestFactory的自定义RestTemplate与版本1.5.x不向后兼容_Java_Spring Boot_Resttemplate - Fatal编程技术网

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

Java 在SpringBoot 2.1.x中使用RestTemplateBuilder的requestFactory的自定义RestTemplate与版本1.5.x不向后兼容,java,spring-boot,resttemplate,Java,Spring Boot,Resttemplate,在Spring Boot 1.5.x中,我创建了一个自定义的RestTemplate,如下所示: @Bean public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) { PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(); pooli

在Spring Boot 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();
  }
但是,在迁移到SpringBoot2.1.x之后,上面的代码不会编译。看起来
requestFactory
没有将
httpcomponents客户端httprequestfactory
作为输入参数


有谁能建议我如何在Spring Boot 2.1.x中使用上述代码吗?

在深入挖掘Spring Boot 2.1.x的
restemplatebuilder
的源代码后,我发现他们删除了方法
requestFactory(clienthtprequestfactory requestFactory)
。这意味着您不能再将
clienthtprequestfactory
对象注入
requestFactory
方法

但是,它现在接受
供应商
作为输入。因此,如果您只有一个restTemplate和一个requestFactory,那么只需在Spring上下文中注册
HttpComponents客户端HttpRequestFactory
bean,并将
ClientHttpPrequestFactorySupplier
传递给
requestFactory
方法。供应商将自动检测您的
HttpComponents客户端HttpRequestFactory
,并返回所需的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的所有更改感兴趣的人,请参考。

如果您有多个需要不同RequestFactory的RestTemplate(而不是第一个找到的RestTemplate的自动注入),这里有一个更通用的解决方案:

@配置
公共类配置{
@豆子
公共RestTemplate RestTemplate(RestTemplateBuilder、ApplicationContext ctx){
返回builder.requestFactory(新的MyRequestFactorySupplier()).build();
}
类MyRequestFactorySupplier实现供应商{
@凌驾
公共clienthtprequestfactory get(){
//使用ApacheHTTP客户端。
HttpClientBuilder clientBuilder=HttpClientBuilder.create();
HttpClient HttpClient=clientBuilder.build();
HttpComponents客户端HttpRequestFactory requestFactory=新的HttpComponents客户端HttpRequestFactory(httpClient);
requestFactory.SetBufferreRequestBody(false);//通过POST或PUT发送大量数据时,建议将此属性更改为false,以免内存不足。
退货申请工厂;
}
}
}

您也可以这样做:

restTemplatebuilder.requestFactory(() -> { return new 
    HttpComponentsClientHttpRequestFactory(httpClient);});
或者更简单,只是:

 restTemplatebuilder.requestFactory(() -> new 
    HttpComponentsClientHttpRequestFactory(httpClient)).build();

附加(和重要)信息:该类仅存在于SpringBoot2.1.0及更高版本中;因此,该解决方案适用于SpringBoot2.1.x+,而不是如前所述的2.x.x。好的,但是如果您有两个restTemplate,需要两个不同的“requestFactory”,该怎么办?由于“ClientHttpRequestFactorySupplier()”自动检测到哪个requestFactory,您如何选择将哪个requestFactory注入哪个restTemplate?我想您已经得到了答案,可以通过实现您自己的供应商来实现。我已经尝试了这一点,但我得到了InvocationTargetException/NullPointerException
 restTemplatebuilder.requestFactory(() -> new 
    HttpComponentsClientHttpRequestFactory(httpClient)).build();