Apache CXF JMS - SOAP

Posted

技术标签:

【中文标题】Apache CXF JMS - SOAP【英文标题】: 【发布时间】:2013-02-18 13:39:33 【问题描述】:

我需要使用相同的 SOAP 请求才能调用方法的相同实现,但该方法由 2 个不同的服务端点公开:

    端点 A - 用于通过 SOAP 进行同步访问 端点 B - 用于通过 JMS 进行异步访问

现在看到的是,在 JMS 和 SOAP Web 服务端点上工作的 SOAP 请求消息在结构上是不同的。

我想知道使用 ApacheCXF 是否可以使用相同的 SOAP 请求调用 SOAP 或 JMS 端点?

在我的情况下,我能够调用两个端点,但每个端点使用的请求并不相同

下面是 SOAP 消息的示例,该消息适用于异步端点 B,但不适用于同步端点 A .. 请注意,我通过执行 Junit 测试获得了异步消息并截获了 ActiveMQ 队列上的生成消息:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

<soap:Body>
    <ns1:create xmlns:ns1="http://service.ws.example/">
        <CustomPartyModel>
            <ns2:customerModel
                xmlns:ns2="http://party.beans.commons.example">
                <ns2:person>
                    <ns2:budgetPlanNumber>131484</ns2:budgetPlanNumber>
                    <ns2:clientSituationCode
                        xmlns:ns3="http://www.w3.org/2001/XMLSchema-instance" ns3:nil="true" />
                    <ns2:employeeReduction>J</ns2:employeeReduction>
                    <ns2:employeeNumber></ns2:employeeNumber>
                    <ns2:packageNumber>5</ns2:packageNumber>
                    <ns2:planIndicator xmlns:ns3="http://www.w3.org/2001/XMLSchema-instance"
                        ns3:nil="true" />
                    <ns2:privateRelationNumber
                        xmlns:ns3="http://www.w3.org/2001/XMLSchema-instance" ns3:nil="true" />
                </ns2:person>
            </ns2:customerModel>

        </CustomPartyModel>
    </ns1:create>
</soap:Body>

这是适用于同步端点但不适用于异步端点的 SOAP 请求。此请求是通过从 WSDL 创建请求获得的:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.example/" xmlns:par="http://party.beans.commons.example">
 <soapenv:Body>
  <ser:CustomPartyModel>
    <par:customerModel>

        <par:person>

           <par:budgetPlanNumber>131484</par:budgetPlanNumber>

           <par:employeeReduction>J</par:employeeReduction>

           <par:employeeNumber></par:employeeNumber>

        <par:packageNumber>5</par:packageNumber>


           <par:professionCodePartner></par:professionCodePartner>

           <par:professionDescriptionPartner></par:professionDescriptionPartner>

        </par:person>
     </par:customerModel>

  </ser:CustomPartyModel>

在这两种情况下,我都使用 Aegis 进行数据绑定,我也尝试过 JAXB,但没有进一步成功。

鉴于其具有相同方法签名的相同方法,您可能希望在异步和同步中都可以使用相同的请求,但情况似乎并非如此。

有人遇到过类似的问题,或者可能对此有所了解吗?

请注意,我使用以下依赖项: cxf-api-2.2.2.jar , cxf-common-utilities-2.2.2.jar, cxf-rt-databinding-aegis-2.2.2.jar, XMLSchema-1.4.5.jar, cxf-rt-transsports-jms-2.2.2.jar, spring-jms-2.5.5.jar, acegi-security-1.0.7.jar

【问题讨论】:

发现 JMS 端点期待 RPC 样式请求,而 SOAP 同步端点默认分别期待 Document 文字......将两者都更改为 RPC 有效,例如 @SOAPBinding(style=Style.RPC, use=Use.LITERAL)...但我没有设法使 JMS 消息成为文档文字 【参考方案1】:

好的,我发现解决方案基本上能够通过 JMS 和同步 SOAP 作为 Document Literal 发送请求,需要在接口上定义以下内容

@WebService
@SOAPBinding(style=Style.DOCUMENT, use=Use.LITERAL,parameterStyle=ParameterStyle.BARE)
public interface ExampleAsyncService 

如果没有 Document / Literal / Bare 配置,JMS 将有发送 RPC 包装样式请求的趋势。

【讨论】:

以上是关于Apache CXF JMS - SOAP的主要内容,如果未能解决你的问题,请参考以下文章

Apache CXF 入门详解

如何确保来自 JMS 队列的消息被传递到外部 WebService (CXF)?

apache cxf wsdl2java命令

apache cxf wsdl2java命令

springboot2 with cxf3.3

cxf http 代码自动生成