我在使用Java创建Web服务时遇到问题,该服务包含两个无参数的方法。创建一个单一的很简单,但我还没想出如何让它与多个一起工作:
<message name="messageOneRequest" />
<message name="messageOneResponse" />
会导致
public void messageOne() { }
但添加
<message name="messageTwoRequest" />
<message name="messageTwoResponse" />
导致“签名”碰撞。我知道签名冲突的原因,这是因为JAX-WS / JAX-RI通过简单地为传入消息留下一个空SOAP Body来尝试使用无参数方法更有效,因此表示单个无参数方法。作为旁注,我使用的是Document而不是RPC。
有没有办法允许这个?我只是缺少一个属性吗?
答案 0 :(得分:0)
我的问题的目标是实现如下的无参数方法:
int someMethod();
ArbitraryObject someOtherMethod();
即使这两个方法不共享相同的名称,它们也有一个冲突的SOAP主体,因为传入的SOAP主体在技术上是相同的(大多数引擎似乎在没有参数时提供空白的效率,而不是某些东西与SOAP主体内部的<someMethod />
一样。)
总而言之,使用Document / Literal时有两种简单的方法可以解决这个问题。解决此问题的最简单方法是简单地为它们提供不同的参数。我最初只是提供了一个虚拟的无操作参数(称为“IgnoredParameter
”)来区分这两个参数。另一种方法是为具有非唯一参数的每个操作的SOAP Action提供唯一值。在使用 wsimport 生成的情况下,您还需要提供“ -extension ”以使其使用该功能,否则它将只是错误输出并忽略其存在SOAP动作。
第二种方法的缺点是SOAP Action与HTTP高度耦合(它用作HTTP头)。就我而言,这不是问题。但是,显然情况并非总是如此,特别是考虑到SOAP是通用的。
使用它的示例绑定(请注意实际提供的soapAction与通常为空白):
<operation name="someOtherMethod">
<wsdlsoap:operation soapAction="urn:someOtherMethod"/>
<input name="someOtherMethodRequest">
<wsdlsoap:body use="literal"/>
</input>
<output name="someOtherMethodResponse">
<wsdlsoap:body use="literal"/>
</output>
</operation>
其他非冲突的操作/方法仍然可以使用soapAction=""
。