使用JAX-WS创建多个无参数函数

时间:2011-08-04 01:03:33

标签: java jax-ws

我在使用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。

有没有办法允许这个?我只是缺少一个属性吗?

1 个答案:

答案 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=""