java Holder vs document-style,或者为什么使用Holders

时间:2013-12-22 13:00:08

标签: java web-services java-ee jax-ws cxf

我最近开始使用document-style web-services。 我已经了解到,通过这种方式,输入/输出消息只能有一个part(“参数”),它可以包含所有数据。
但是现在我读到了Holders,根据this链接,它用于返回多个参数。 现在我想知道,如果我可以使用包含所有内容的文档样式响应,我为什么要使用Holders呢? 我发现here的其他信息仍然让我不确定。

1 个答案:

答案 0 :(得分:3)

  

我最近开始使用文档式的Web服务。我学过   以这种方式,我们只能有一个部分(“参数”)   输入/输出消息,可以包含所有数据。

您必须区分document/literal bare (or unwrapped)document/literal wrapped。虽然对于后者你的说法是正确的,但对于引物而言却是错误的。与an IBM guide for the specific type encodings相关,您会看到document/literal bare可以指定多个part元素:

<types>
    <schema>
        <element name="xElement" type="xsd:int"/>
        <element name="yElement" type="xsd:float"/>
    </schema>
</types>

<message name="myMethodRequest">
    <part name="x" element="xElement"/>
    <part name="y" element="yElement"/>
</message>
<message name="empty"/>

<portType name="PT">
    <operation name="myMethod">
        <input message="myMethodRequest"/>
        <output message="empty"/>
    </operation>
</portType>

导致SOAP消息:

<soap:envelope>
    <soap:body>
        <xElement>5</xElement>
        <yElement>5.0</yElement>
    </soap:body>
</soap:envelope>

然而,主要缺点之一是您丢失了有关所调用方法的信息 - 除了不符合WS-I之外。因此,使用document/literal wrapped(推荐的绑定样式)来绕过bare绑定样式的限制。

进一步注意document/literal wrapped本身并不是实际WSDL规范的一部分:

  

在文档/文字样式的消息传递中,存在一种模式   被称为包裹文档/文字。这只是一种模式,而且是   不是WSDL规范的一部分。这种模式在JSR中有提及   224(JAX-WS:基于XML的Web服务的Java API)。   (Source


@Edit:由于您的原始问题以及您对Handler s使用原因的评论:

WSDL指定INOUTINOUT参数。虽然前两个参数很容易理解,但后者有点棘手,因为发送到服务的参数应该以修改后的状态返回。

但是,Java是按值传递而不是通过引用传递并启用相同参数的更新,类似于通过引用传递的方式,Handler可用于“伪造”WSDL符合处理OUTINOUT参数。

有关简单的代码示例以及可能更好的解释,请have a look at a very similar question and its answer