如何在Spring Integration中调用SOA Webservice操作并解决Unknown method报错
报错根因
你遇到的SoapFaultClientException: Unknown method错误核心原因是<int-ws:outbound-gateway>未明确指定要调用的Webservice操作对应的SOAP Action值,且默认配置下网关会尝试自动解析请求对应的操作,手动拼接的字符串SOAP请求无法被正确识别操作标识,因此服务端无法匹配到对应的处理方法。
两种调用配置方案
方案1:直接使用你已构造的字符串SOAP请求
无需额外配置编组器,仅需要在出站网关配置中补充soap-action属性,属性值必须和目标Webservice WSDL中对应操作的soapAction定义完全一致:
<int-ws:outbound-gateway id="invokeService" request-channel="requestChannel" reply-channel="responseChannel" uri="http://[host]:[port]/app/service" soap-action="http://你的服务命名空间/你要调用的操作名" />
如果你拼接的SOAP请求结构完全符合WSDL定义,补充该配置后即可正常调用。
方案2:基于POJO自动生成SOAP请求(推荐)
不需要手动拼接SOAP字符串,通过编组器自动完成POJO到SOAP请求的转换:
- 首先配置JAXB2编组器,指定你的POJO所在的扫描包路径:
<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> <property name="contextPath" value="你的POJO类所在的包路径" /> </bean>
- 修改出站网关配置,关联编组器、解组器,同时指定SOAP Action:
<int-ws:outbound-gateway id="invokeService" request-channel="requestChannel" reply-channel="responseChannel" uri="http://[host]:[port]/app/service" marshaller="jaxb2Marshaller" unmarshaller="jaxb2Marshaller" soap-action="http://你的服务命名空间/你要调用的操作名" />
配置完成后,直接把POJO对象放入requestChannel的消息payload中即可,网关会自动完成POJO到SOAP请求的序列化,以及响应到POJO的反序列化。如果你的操作入参是字符串类型,直接将字符串作为payload传入即可,无需额外处理。
学习资源推荐
- 优先参考Spring Integration官方文档中Web Services模块的专属章节,重点关注出站网关参数说明、编组配置、SOAP头配置三个部分的内容
- 书籍推荐《Spring Integration in Action》,由Spring Integration核心开发团队编写,包含全场景集成实战示例,其中有完整的SOAP服务调用的实操案例,适配不同业务场景
- 可以参考Spring官方技术博客中发布的Spring Integration WS相关的实战文章,均为经过验证的可落地配置方案
内容的提问来源于stack exchange,提问作者Mikaelangel
相关产品推荐
相关产品推荐

