You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:03:37