Java SOAP “wsimport” - 强制从 document/literal wrapped WSDL 进行包装绑定?

2022-09-03 08:37:38

Java 6 JAX-WS “wsimport” 实用程序在生成给定 WSDL 文件的 Web 服务框架(接口)方面做得很好,但有一个令人讨厌的例外。

当给定一个使用 SOAP 文档/文本包装样式此处也描述)的 WSDL 时,它会生成一个具有“裸”SOAP 绑定参数样式的服务接口(在方法签名中具有多个参数和扩展为“持有者”对象的返回值),而不是由 WSDL 指定的简单包装参数和返回值。其他工具,如Axis2 wsdl2java,只是使用包装器元素作为输入参数和返回值,而不是自动“解开”它们。

是否可以告诉“wsimport”将 SOAP 绑定参数保留为“包装”而不是“裸”?


答案 1

AFAIK,您需要指定一个自定义绑定文件来禁用包装器样式:

<bindings
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    wsdlLocation="OperationService.wsdl"
    xmlns="http://java.sun.com/xml/ns/jaxws">
        <!-- Disable default wrapper style -->
        <enableWrapperStyle>false</enableWrapperStyle>
</bindings>

然后调用 wsimport

$ wsimport -b binding.xml OperationService.wsdl

答案 2

@beny23的答案是正确的。但是,事实证明,您可以将 JAX-WS 绑定指令嵌入到 WSDL 文件本身中,这样就无需将 “” 开关添加到 “” 命令中:-b binding.xmlwsimport

<wsdl:portType name="HelloPortType">
  <jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
    <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
  </jaxws:bindings>
  <wsdl:operation name="sayHello">...</wsdl:operation>
</wsdl:portType>

推荐