我最近开始使用文档样式的网络服务。我学过
这样我们就可以只有一个部分(“参数”)
输入/输出消息,可以包含所有数据。
您必须区分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:由于您的来源问题和您对为什么可能使用Handlers 的评论:
WSDL 指定IN、OUT 和INOUT 参数。虽然前两个参数很容易理解,但后者有点棘手,因为发送到服务的参数应该与修改后的状态一起返回。
然而,Java 是按值传递而不是按引用传递,并启用相同参数的更新,类似于按引用传递的工作方式,Handlers 可用于“伪造”一个 WSDL 符合处理OUT 或 INOUT 参数。
对于一个简单的代码示例和可能更好的解释,请have a look at a very similar question and its answer