cxf Magento SOAP请求无效:完整操作名称

时间:2015-05-19 14:12:57

标签: java soap apache-camel cxf apache-karaf

我正在尝试使用在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调用工作。

我错过了什么?

0 个答案:

没有答案