我最近开始使用document-style web-services
。
我已经了解到,通过这种方式,输入/输出消息只能有一个part
(“参数”),它可以包含所有数据。
但是现在我读到了Holders
,根据this链接,它用于返回多个参数。
现在我想知道,如果我可以使用包含所有内容的文档样式响应,我为什么要使用Holders呢?
我发现here的其他信息仍然让我不确定。
答案 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指定IN
,OUT
和INOUT
参数。虽然前两个参数很容易理解,但后者有点棘手,因为发送到服务的参数应该以修改后的状态返回。
但是,Java是按值传递而不是通过引用传递并启用相同参数的更新,类似于通过引用传递的方式,Handler
可用于“伪造”WSDL符合处理OUT
或INOUT
参数。
有关简单的代码示例以及可能更好的解释,请have a look at a very similar question and its answer