我正在尝试使用在Apache Karaf中运行的Apache Camel中的Apache cxf与Magento的SOAP Api(启用v2,启用ws-i)进行通信。使用“cxf-codegen-plugin”maven插件生成服务实现。
“登录”操作的结果请求如下所示:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="urn:Magento">
<soap:Body>
<ns:login>
<ns:loginParam>
<username>username</username>
<apiKey>apikey</apiKey>
</ns:loginParam>
</ns:login>
</soap:Body>
</soap:Envelope>
但是,它看起来应该是这样的(取自soap-ui):
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="urn:Magento">
<soap:Body>
<ns:loginParam>
<username>username</username>
<apiKey>apikey</apiKey>
</ns:loginParam>
</soap:Body>
</soap:Envelope>
关键区别在于cxf围绕soap body的内容生成一个包装元素,这是一个完整的soap操作名称(在这种情况下:login)。
根据cxf的文档(参见http://cxf.apache.org/docs/http-binding.html,“配置服务”),它明确指出: “... ServiceFactory在”包装“模式下工作。这只意味着我们的xml文档将用操作名称包装......”
据我所知,服务和绑定信息已经生成,而不是使用“包装”模式。
此外,我的camel cxf:endpoint的相应蓝图配置明确禁用“包装”服务调用。
<camelcxf:cxfEndpoint ...>
[...]
<camelcxf:properties>
[...]
<entry key="wrapped" value="false" />
</camelcxf:properties>
</camelcxf:cxfEndpoint>
此外,生成的端口接口“MageApiModelServerWsiHandlerPortType”表明参数应该“裸”传递:
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
现在更加混淆:如果这个客户端在Apache Karaf之外使用(例如在IntelliJ调试器中使用独立的Apache camel上下文),soap请求看起来像预期的那样,我的api调用工作。
我错过了什么?