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的主要内容,如果未能解决你的问题,请参考以下文章