0

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

  1. 端点 A - 用于通过 SOAP 进行同步访问
  2. 端点 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

4

1 回答 1

0

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

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

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

于 2013-02-19T09:46:22.710 回答