【问题标题】:WebServices : bare vs wrapped?WebServices:裸露与包装?
【发布时间】:2011-03-16 10:34:35
【问题描述】:

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

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

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

和其他人用

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 

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

【问题讨论】:

  • 您能发布您的 wsdl 文件吗?
  • XJC 不这样做,这是wsimport 工具的工作。

标签: java web-services jax-ws


【解决方案1】:

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

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

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

【讨论】:

  • 清晰而有帮助的答案!谢谢。
  • 是否有官方文档可以进一步解释?规范文档可能是?
  • JAX-WS 2.1 specification 在第 2.3.1.2 节(“包装器样式”)中对此进行了解释
【解决方案2】:

This discussion 在 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”),它在 身体。在第二种情况下,参数在代码中是“裸露的”,但是 由 JAX-WS 在运行时“包装”。

希望这会有所帮助!

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      public int add(int num1, int num2)
      

      但是如果你使用 WRAPPED 和 wsimport 那么;

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

      生成。这是从早期的 DCE/RPC 时代采用的。

      【讨论】:

        猜你喜欢
        • 2019-12-25
        • 2012-01-05
        • 2016-08-18
        • 1970-01-01
        • 2019-09-03
        • 1970-01-01
        • 2016-06-14
        • 2011-06-29
        • 1970-01-01
        相关资源
        最近更新 更多