Apache CXF JMS - SOAP

时间:2013-02-18 13:39:33

标签: apache soap wsdl jms cxf

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

  1. 端点A - 用于通过SOAP进行同步访问
  2. 端点B - 将通过JMS进行异步访问
  3. 现在看到的是,在JMS和SOAP Web服务端点上运行的SOAP请求消息在结构上是不同的。

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

    在我的情况下,我能够调用两个端点,但每个

    使用的请求不一样

    下面是一个SOAP消息的示例,该消息适用于Asynch Endpoint B,但不能在Synch Endpoint A上运行。请注意,我通过执行Junit测试获取了Asynch消息,并在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>
    

    这是在同步端点上工作但不在Asynch上的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常见的实用工具,2.2.2.jar, CXF-RT-绑定宙斯盾-2.2.2.jar, XMLSchema的1.4.5.jar, CXF-RT-传输的JMS-2.2.2.jar, 弹簧JMS-2.5.5.jar, 的acegi安全-1.0.7.jar

1 个答案:

答案 0 :(得分:0)

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

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

如果没有Document / Literal / Bare配置,JMS将倾向于发送RPC包装样式请求。