当前位置: 首页 > 面试题库 >

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

夔波
2023-03-14
问题内容

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();
  }

但是,在迁移到 Spring Boot 2.1.x之后
,上面的代码无法编译。看起来好像requestFactoryHttpComponentsClientHttpRequestFactory作为输入参数。

谁能建议我如何在Spring Boot 2.1.x中实现以上代码?


问题答案:

在深入RestTemplateBuilder研究 Spring Boot 2.1.x
的源代码之后,我发现他们已经删除了该方法requestFactory(ClientHttpRequestFactory requestFactory)。这意味着您不能再将ClientHttpRequestFactory对象注入到requestFactory方法中。

但是,它现在接受a
Supplier<ClientHttpRequestFactory>作为输入。因此,如果您只有一个restTemplate和一个requestFactory,那么您要做的就是HttpComponentsClientHttpRequestFactory在Spring上下文中注册一个bean并传递一个ClientHttpRequestFactorySupplierto
requestFactory方法。供应商将自动检测到您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。



 类似资料:
  • 如果我有一个用SwiftUI制作的应用程序,它是否适用于iOS13以下的iOS?

  • Spring启动版本 1.5.x 可以与 Java 11 一起使用吗?还是有必要将其移至2.1.x春节?

  • 问题内容: 当我在控制台中键入时,我得到了。软链接指向。在Java首选项窗口中,唯一列出的Java版本是1.8。JAVA_HOME设置为。 但是,当我尝试运行Eclipse.app时,出现错误: 我相信它正在尝试使用,并且在该目录中唯一的版本是。 如何获得Eclipse以使用正确版本的Java? 问题答案: 下载64位版本的Eclipse,而不是32位版本。 原因是Eclipse包含本机机器代码(

  • 我正在尝试使用Cassandra 2.1升级到Spring Data Cassandra 1.5. x的Spring Boot 1.5,但出现启动错误: 未能实例化[org.springframework.data.cassandra.mapping.CassandraMappingContext]:工厂方法“cassandraMapping”引发异常;嵌套异常为java.lang.NoClass

  • 我想用react native安装realm localDb,但在项目中安装此包后,不要使用此命令运行react native run android, 我不知道这个错误是什么意思!!! 此版本中使用了不推荐的Gradle功能,使其与Gradle 7.0不兼容 AndroidGradle版本 试验装置 真正的devoice android 9 我看这个答案,但不帮助我!!!已弃用的渐变功能是。。。

  • Python的3​​.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。 为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下相容。 许多针对早期Python版本设计的程式都无法在Python 3.0上正常执行。 为了照顾现有程式,Python 2.6作为一个过渡版本,基本使用了Python 2.x的语法和库,同时考虑了向Pyt