Java Ranch 论坛上的这个讨论为我清除了它。特别是Jason Irwin制作的这个例子:
BARE客户端生成的接口(使用 wsimport):
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface IMathServer {
@WebMethod
@WebResult(name = "addNumsResponse")
public AddNumsResponse addNums(@WebParam(name = "addNums") AddNums parameters);
}
WRAPPED客户端生成的接口(使用 wsimport):
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
public interface IMathServer {
@WebMethod
@WebResult(name = "addNumsResponse")
public int addNums(@WebParam(name = "num1") int num1, @WebParam(name = "num2") int num2);
}
这两条代码生成相同的消息:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:addNums xmlns:ns2="http://SoapStyles/">
<num1>1</num1>
<num2>2</num2>
</ns2:addNums>
</S:Body>
</S:Envelope>
正如R Srini在同一讨论中所说,包装的是参数,而不是代码。
生成客户端的唯一区别是您将在客户端中创建参数的方式,但它们都将根据服务 WSDL 生成相同的消息(已包装或未包装)。
使用 BARE,您将只有一个顶部元素(参数),其中包含“子参数”。这一个 BARE 将直接发送(不“包装”它)。在使用 WRAPPED 时,您将在第一级拥有所有这些“子参数”,并且客户端会自动将它们包装在另一个顶级元素中。
引用杰森欧文的话:
只传递了一个参数(“addNums”),它在正文中是“Bare”。在第二种情况下,参数在代码中是“裸露的”,但在运行时由 JAX-WS “包装”。
希望这可以帮助!