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

时间:2011-08-11 20:27:15

标签: java soap wsdl jax-ws wsimport

Java 6 JAX-WS“wsimport”实用程序在给定WSDL文件的情况下可以很好地生成Web服务框架(接口),但有一个个人讨厌的异常。

当给定使用SOAP Document/literal wrapped stylealso described here)的WSDL时,它会生成一个带有“bare”SOAP binding parameter style的服务接口(带有多个参数,返回值扩展为"holder" objects在方法签名中)而不是由WSDL指定的简单包装参数和返回值。其他工具,例如Axis2 wsdl2java,只需使用包装元素作为输入参数并返回值,而不是自动“解包”它们。

是否可以告诉“wsimport”将SOAP绑定参数保持为“wrapped”而不是“bare”?

2 个答案:

答案 0 :(得分:37)

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

答案 1 :(得分:15)

@ beny23的回答是正确的;但是,事实证明您可以embed the JAX-WS binding instructions into the WSDL file itself,这样就无需将“-b binding.xml”开关添加到“wsimport”命令中:

<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>