WebServices : bare vs wrappeed?

2022-09-02 11:36:09

我从一些现有的wsdl中生成一些Web服务

我使用Maven来做到这一点,但是一些Web服务是用

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)  

和其他与

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 

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


答案 1

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

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

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


答案 2

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);  
}  

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

<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 时,您将在第一级中拥有所有这些“子参数”,客户端会自动将它们包装在另一个顶部元素中。

引用Jason Irwin的话:

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

希望这有帮助!


推荐