WebServices:裸vs包裹?

我从一些现有的wsdl中生成了一些WebServices

我使用Maven来做这个,但生成了一些web服务

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) 

和其他人一起

 @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 

Jaxb或xjc会自动执行此操作吗? 因为我在wsdls中没有任何差异……

当“操作”名称,“消息”名称和“元素”名称在某种形状或forms上不同时,将生成BARE Web服务。 要将您的客户端或服务存根自动生成为WRAPPED,所有这三个元素必须相同。

解决方法是编写自己的存根并使用@ RequestWrapper / @ ResponseWrapper注释。

PS:所有portType操作都必须具有“包装”样式请求/响应。 即使是最轻微的偏差也会默认为BARE。

Java Ranch Forum的讨论为我清除了它。 特别是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); } 

这两段代码生成相同的消息:

    1 2    

正如R Srini在同一讨论中所说的那样,包装的是参数,而不是代码。

生成客户端的唯一区别是您要在客户端中创建params的方式,但它们都将根据服务WSDL生成相同的消息(包装或解包)。

使用BARE,您将只有一个带有“子参数”的顶部元素(参数)。 这一个BARE将直接发送(不“包装”它)。 使用WRAPPED时,您将在第一级中拥有所有这些“子参数”,并且客户端会自动将它们包装在另一个顶级元素中。

引用杰森欧文:

只传递了一个参数(“addNums”),并且它在主体中是“Bare”。 在第二个中,参数在代码中是“裸”的,但是在运行时由JAX-WS“包装”。

希望这可以帮助!

指定如何将与WSDL协定中的消息部分对应的方法参数放入SOAP消息正文中。 BARE的参数样式意味着每个参数都作为消息根的子元素放入消息体中。 WRAPPED的参数样式意味着所有输入参数都包装在请求消息上的单个元素中,并且所有输出参数都包装在响应消息中的单个元素中。 如果将样式设置为RPC,则必须使用WRAPPED参数样式。

参考http://cxf.apache.org/docs/developing-a-service.html