配置Spring WebServiceTemplate超时遇HttpComponentsMessageSender相关NoSuchMethodError
解决HttpComponentsMessageSender配置超时出现NoSuchMethodError的问题
这个错误的核心原因是Spring Web Services(Spring WS)和Apache HttpClient(HttpComponents)的版本不兼容,我来帮你拆解问题和解决办法:
为什么会出现这个错误?
Apache HttpClient在4.3版本对连接管理的API做了重大重构:
- 旧版本(4.2及以下)使用的是
SchemeSocketFactory类,对应的Scheme构造方法是Scheme(String, int, SchemeSocketFactory) - 4.3+版本替换成了
ConnectionSocketFactory,Scheme的构造方法也随之变更,不再支持传入SchemeSocketFactory
而你的Spring WS版本如果是基于旧版HttpClient开发的,但项目中引入了4.3+的HttpClient,就会找不到这个旧的构造方法,抛出NoSuchMethodError。
具体解决方案
1. 匹配兼容的版本组合
根据你的Spring WS版本选择对应的HttpClient版本:
- 如果用的是Spring WS 2.1.x及更早:搭配HttpClient 4.2.x稳定版(比如
4.2.6) - 如果用的是Spring WS 2.2.x及以上:搭配HttpClient 4.3+稳定版(比如
4.5.14)
2. 排查并排除依赖冲突
很多时候项目会通过其他依赖间接引入不同版本的HttpClient,导致版本冲突。你可以用依赖管理工具检查:
- Maven:执行
mvn dependency:tree查看依赖树,找出所有httpclient的引用 - Gradle:执行
./gradlew dependencies查看
找到冲突的版本后,在Spring WS的依赖中排除掉不兼容的HttpClient,再手动引入正确的版本。比如Maven的配置示例:
<!-- 排除Spring WS自带的不兼容HttpClient --> <dependency> <groupId>org.springframework.ws</groupId> <artifactId>spring-ws-core</artifactId> <version>你的Spring WS版本号</version> <exclusions> <exclusion> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入兼容的HttpClient版本 --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.2.6</version> <!-- 对应Spring WS 2.1.x --> <!-- 或者 4.5.14 对应Spring WS 2.2+ --> </dependency>
3. 替代方案:改用SimpleHttpMessageSender
如果你的场景不需要HttpClient的连接池、自定义代理等高级特性,可以直接使用Spring自带的SimpleHttpMessageSender,它基于JDK原生的HttpURLConnection,配置简单且无版本兼容问题:
<bean class="org.springframework.ws.transport.http.SimpleHttpMessageSender" id="timeoutId"> <property name="connectionTimeout" value="3000" /> <property name="readTimeout" value="3000" /> </bean>
验证步骤
- 确认依赖树中只有你指定的HttpClient版本
- 清理项目构建缓存(Maven的
clean,Gradle的clean) - 重启应用,测试超时配置是否生效
内容的提问来源于stack exchange,提问作者iLearn
相关产品推荐
相关产品推荐

