WebServices:裸vs包裹?

时间:2011-03-16 10:34:35

标签: java web-services jax-ws

我从一些现有的wsdl

中生成了一些Web服务

我使用Maven来执行此操作,但是使用

生成了一些Web服务
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)  

和其他人

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 

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

4 个答案:

答案 0 :(得分:27)

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

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

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

答案 1 :(得分:18)

Java Ranch论坛的

This discussion为我清除了它。特别是这个例子由 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 在同一讨论中所说的那样,包装的是参数,而不是代码。

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

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

引用杰森欧文:

  

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

希望这有帮助!

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

顾名思义,“ ParameterStyle”更改了在方法调用中传递和获取参数的语法。而且,它对wsimport生成的客户端工件有所不同,而不会对已发布的服务和客户端/服务之间交换的有效负载产生任何影响。 如果将BARE与wsimport一起使用,则会生成以下代码;

public int add(int num1, int num2)

但是如果您将wsimport与WRAPPED一起使用,则

public void add(int num1, int num2, Holder result)
生成

。这是从早期的DCE / RPC时代开始采用的。