Spring 6迁移报错:HttpComponentsClientHttpRequestFactory类型转换失败
问题根源
Spring 6升级后,org.springframework.http.client.HttpComponentsClientHttpRequestFactory的connectTimeout属性类型从原有的long(毫秒数值)改为了java.time.Duration,而你当前XML配置中直接传入的数字字符串无法被Spring自动转换为Duration类型,导致抛出类型转换异常。
解决方案
方案1:使用ISO-8601 Duration格式配置值
直接将配置值改为Duration类识别的ISO-8601格式,比如原配置的5000毫秒对应PT5S(PT表示时间段,5S代表5秒)。若使用配置占位符,写法如下:
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> <constructor-arg> <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"> <constructor-arg> <bean class="MyHttpClientFactory"> <property name="keepAliveMS" value="${keepalive:300000}"/> </bean> </constructor-arg> <property name="connectTimeout" value="${connectTimeout:PT5S}"/> </bean> </constructor-arg> </bean>
如果你的配置文件中connectTimeout的值仍是数字(如5000),可以直接修改配置值为ISO格式,或者在占位符中统一转换。
方案2:改用Java配置类创建Bean
通过Java配置类手动完成毫秒数到Duration的转换,更灵活且避免XML的类型转换问题:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; import org.springframework.beans.factory.annotation.Value; import java.time.Duration; @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(MyHttpClientFactory myHttpClientFactory, @Value("${connectTimeout:5000}") long connectTimeoutMs) { HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(myHttpClientFactory); requestFactory.setConnectTimeout(Duration.ofMillis(connectTimeoutMs)); return new RestTemplate(requestFactory); } @Bean public MyHttpClientFactory myHttpClientFactory(@Value("${keepalive:300000}") long keepAliveMS) { MyHttpClientFactory factory = new MyHttpClientFactory(); factory.setKeepAliveMS(keepAliveMS); return factory; } }
方案3:注册Duration属性转换器(XML方式)
在Spring XML上下文注册DurationEditor,让Spring自动将数字字符串转换为Duration:
<!-- 注册Duration类型转换器 --> <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"> <property name="customEditors"> <map> <entry key="java.time.Duration"> <bean class="org.springframework.format.datetime.standard.DurationEditor"/> </entry> </map> </property> </bean> <!-- 原RestTemplate配置无需修改 --> <bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> <constructor-arg> <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"> <constructor-arg> <bean class="MyHttpClientFactory"> <property name="keepAliveMS" value="${keepalive:300000}"/> </bean> </constructor-arg> <property name="connectTimeout" value="${connectTimeout:5000}"/> </bean> </constructor-arg> </bean>
内容的提问来源于stack exchange,提问作者Nidhi257
相关产品推荐
相关产品推荐

