Spring Boot 3创建SOAP WebService客户端遇HTTPS连接超时问题求助
Spring Boot 3调用公开SOAP WebService连接超时问题排查
问题分析
从异常栈核心错误java.net.ConnectException: Connection timed out可以判断,客户端无法建立到目标SOAP服务的网络连接,问题可分为网络层面和客户端配置层面两类。
排查步骤与解决方案
1. 先确认网络连通性
先排除本地网络无法访问目标服务的情况:
- 用curl命令直接测试服务连通性:
curl -X POST https://www.dataaccess.com/webservicesserver/NumberConversion.wso \ -H "Content-Type: text/xml" \ -d '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.dataaccess.com/webservicesserver/"> <soapenv:Header/> <soapenv:Body> <web:NumberToWords> <web:ubiNum>25</web:ubiNum> </web:NumberToWords> </soapenv:Body> </soapenv:Envelope>' - 如果curl也超时,说明是本地网络问题:
- 检查防火墙/安全组是否允许 outbound 访问该服务的443端口
- 企业内网环境下,需确认是否需要通过代理服务器访问外部网络
2. 配置Spring-WS的连接超时
Spring-WS默认的连接/读取超时可能过短,导致无法在规定时间内建立连接或获取响应,可通过HttpComponentsMessageSender自定义超时:
第一步:添加HTTP客户端依赖
在pom.xml中引入Spring Boot的HTTP客户端 starter:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-httpclient</artifactId> </dependency>
第二步:配置消息发送器与超时
修改NumberConversionConfiguration类,添加超时配置并绑定到客户端:
@Configuration public class NumberConversionConfiguration { @Bean public Jaxb2Marshaller marshaller() { Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setContextPath("com.microservices.demo.soap.service.ws.numberconversion.stub"); return marshaller; } @Bean public HttpComponentsMessageSender messageSender() { HttpComponentsMessageSender sender = new HttpComponentsMessageSender(); // 设置连接超时(单位:毫秒) sender.setConnectionTimeout(5000); // 设置读取超时(单位:毫秒) sender.setReadTimeout(10000); return sender; } @Bean public NumberConversionClient countryClient(Jaxb2Marshaller marshaller, HttpComponentsMessageSender messageSender) { NumberConversionClient client = new NumberConversionClient(); client.setDefaultUri("https://www.dataaccess.com/webservicesserver/NumberConversion.wso"); client.setMarshaller(marshaller); client.setUnmarshaller(marshaller); // 绑定自定义的消息发送器 client.setMessageSender(messageSender); return client; } }
3. 配置代理(如果需要)
企业内网需通过代理访问外部服务时,修改messageSender配置添加代理:
@Bean public HttpComponentsMessageSender messageSender() { HttpComponentsMessageSender sender = new HttpComponentsMessageSender(); // 配置代理服务器,替换为实际代理地址和端口 HttpHost proxy = new HttpHost("your-proxy-host", 8080); HttpClientBuilder clientBuilder = HttpClientBuilder.create().setProxy(proxy); // 配置超时 RequestConfig requestConfig = RequestConfig.custom() .setConnectTimeout(5000) .setSocketTimeout(10000) .build(); clientBuilder.setDefaultRequestConfig(requestConfig); sender.setHttpClient(clientBuilder.build()); return sender; }
4. 确认端点URL正确性
检查wsimport生成的服务类(如NumberConversion)中的默认端点地址,确认与你配置的defaultUri一致。部分场景下WSDL中的实际服务地址可能和提供的URL存在细微差异。
总结
优先排查网络连通性,再通过配置超时和代理解决客户端层面的问题,最后确认端点地址无误。按照上述步骤调整后,即可解决连接超时问题。
内容的提问来源于stack exchange,提问作者Abhi
相关产品推荐
相关产品推荐

