WebServices:裸vs包裹?

Cri*_*ris 18 java web-services jax-ws

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

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

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)  
Run Code Online (Sandbox Code Playgroud)

和其他人一起

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 
Run Code Online (Sandbox Code Playgroud)

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

小智 27

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

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

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

  • [JAX-WS 2.1规范](http://jcp.org/aboutJava/communityprocess/pfd/jsr224/index.html)在第2.3.1.2节("包装样式")中对此进行了解释 (5认同)
  • 是否有正式文件可以进一步解释?规范文件可能是? (3认同)

Chr*_*lma 19

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);  
}  
Run Code Online (Sandbox Code Playgroud)

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);  
}  
Run Code Online (Sandbox Code Playgroud)

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

<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>  
Run Code Online (Sandbox Code Playgroud)

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

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

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

引用杰森欧文:

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

希望这可以帮助!