SOAP客户端代码调用报WebServiceTransportException:404异常,SOAP UI请求正常求解决
嘿,我之前也碰到过类似的糟心事——SOAP UI能正常调用服务拿到响应,自己写的Spring WS客户端一请求就报org.springframework.ws.client.WebServiceTransportException: [404],简直摸不着头脑。不过别慌,既然SOAP UI能成功,说明服务本身是没问题的,问题大概率出在客户端的配置或者请求细节上。下面给你几个实用的排查方向:
1. 先核对请求地址是否完全一致
这是最容易踩坑的点!你把SOAP UI里用的请求地址,和客户端代码里WebServiceTemplate配置的defaultUri一字不差地对比一遍。有没有少写路径后缀?比如SOAP UI里是http://xxx:8080/soap/service/OrderPort,客户端写成了http://xxx:8080/soap/OrderPort;或者协议写错了,比如把HTTP写成了HTTPS?哪怕一个字符不对,都会直接返回404。
2. 检查SOAPAction头是否正确设置
很多SOAP服务是靠SOAPAction请求头来路由到具体接口的。你打开SOAP UI的请求日志,看看请求头里的SOAPAction字段值是什么,比如"http://your-service-namespace/placeOrder"。然后检查你的客户端有没有正确传递这个头:
webServiceTemplate.marshalSendAndReceive(request, new WebServiceMessageCallback() { @Override public void doWithMessage(WebServiceMessage message) { ((SoapMessage) message).setSoapAction("http://your-service-namespace/placeOrder"); } });
要是客户端没传这个头,服务端可能找不到对应的端点,直接返回404。
3. 对比客户端和SOAP UI的请求报文
有时候客户端生成的SOAP报文和SOAP UI的有细微差异,比如命名空间不对、根元素名称写错,或者元素顺序不符合服务端要求(有些严格的服务端对顺序很敏感),这也会导致服务端识别不了请求,返回404。
你可以开启Spring WS的日志,看看客户端实际发出去的报文:
在application.properties里加这两行:
logging.level.org.springframework.ws.client.MessageTracing.sent=TRACE logging.level.org.springframework.ws.server.MessageTracing.received=TRACE
然后把日志里的报文和SOAP UI的请求报文逐行对比,找差异点。
4. 确认服务端的端点映射配置
如果服务端也是用Spring WS搭的,检查一下DefaultWsdl11Definition的配置,比如locationUri是不是和客户端请求的地址对应;还有MessageDispatcherServlet的映射路径有没有覆盖客户端的请求路径,比如是不是配置成了/soap/*而不是/services/*?
5. 排查网络层面的问题
有时候客户端所在环境有代理、防火墙,或者端口被占用,导致请求根本没到达服务端,也会返回404。你可以在客户端机器上用curl或者Postman模拟SOAP UI的请求,看看能不能成功。如果不行,那就是网络或者环境配置的问题了。
先从地址匹配这个最基础的点查起,大概率能解决问题。要是还是不行,把你的客户端配置代码和SOAP UI的请求信息贴出来,咱们再精准定位。
内容的提问来源于stack exchange,提问作者Pavel Orlov

