为何需两次传递HttpComponentsClientHttpRequestFactory给RestTemplateBuilder与RestTemplate?
为什么要两次给RestTemplate传递HttpComponentsClientHttpRequestFactory?
先看你给出的原代码:
@Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); factory.setXXX(...); ... builder.requestFactory(() -> factory); // 这行实际无效 RestTemplate restTemplate = builder.build(); restTemplate.setRequestFactory(factory); // 这行才真正生效 return restTemplate; }
核心原因:误解了RestTemplateBuilder的不可变特性
RestTemplateBuilder是不可变对象——调用它的任何配置方法(比如requestFactory)都会返回一个全新的Builder实例,而不是修改原来的那个。
原代码里的builder.requestFactory(() -> factory);这行根本没生效,因为没有把返回的新Builder赋值给变量,后续调用builder.build()还是用的最初注入的那个未配置的Builder,自然不会带上你设置的请求工厂。
而后面的restTemplate.setRequestFactory(factory);是直接操作构建好的RestTemplate实例,这才是真正把请求工厂配置进去的步骤。
正确的写法
不需要两次传递,只要正确使用RestTemplateBuilder的链式调用或接收新实例即可:
写法一:链式调用
@Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); factory.setXXX(...); // 链式调用,直接用返回的新Builder构建实例 return builder.requestFactory(() -> factory).build(); }
写法二:接收新Builder实例
@Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); factory.setXXX(...); // 保存配置后的新Builder RestTemplateBuilder configuredBuilder = builder.requestFactory(() -> factory); return configuredBuilder.build(); }
内容的提问来源于stack exchange,提问作者techie11
相关产品推荐
相关产品推荐

