Java 为wsdl生成客户端代码,在主体中包含更多部分

Java 为wsdl生成客户端代码,在主体中包含更多部分,java,soap,wsdl,cxf,wsimport,Java,Soap,Wsdl,Cxf,Wsimport,我目前正在开发客户端应用程序,使用波兰财政部的官方API检查NIP编号。() 不幸的是,我对他们发布的wsdl有一个问题。即有一条包含两部分的消息 <wsdl:message name="SprawdzNIPNaDzienZapytanie"> <wsdl:part name="NIP" element="tns:NIP"/> <wsdl:part name="Data" element="tns:Data"/> </wsdl:messa

我目前正在开发客户端应用程序,使用波兰财政部的官方API检查NIP编号。() 不幸的是,我对他们发布的wsdl有一个问题。即有一条包含两部分的消息

<wsdl:message name="SprawdzNIPNaDzienZapytanie">
    <wsdl:part name="NIP" element="tns:NIP"/>
    <wsdl:part name="Data" element="tns:Data"/>
</wsdl:message>
bindings.xml
文件:

<jaxws:bindings
        wsdlLocation="my.wsdl"
        xmlns="http://java.sun.com/xml/ns/jaxws"
        xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
    <enableWrapperStyle>true</enableWrapperStyle>
</jaxws:bindings>

真的
不幸的是,端口仍然使用


@SOAPBinding(parameterStyle=SOAPBinding.parameterStyle.BARE)
而不是包装的注释。

当parameterStyle为BARE时,web方法应该只有一个参数

对于文档样式的web服务,BP要求每条消息 没有或只有一部分

以下是一个例子:

<message name = "SubmitPurchaseOrderMessage">
    <part name="Order" element "sd:purchaseOrder"/>
</message>

因此,这意味着参数都在SOAP请求的元素内部

  • 当参数样式被包装时,将所有 参数包装在元素中
  • 当 参数样式为裸样式,所有参数均未包装在任何 元素
因此,将其置于doc/lit/bare下是有意义的:

<message name="add">
       <part name="parameter1" element="tns:a"/>
 </message>

架构将显示如下内容:

<add>
   <element name="parameter1" type:int/>
</add>

如果您想在不更改wsdl文件的情况下使其成为包装样式,那么可以使用绑定文件和cxf来生成代码

下面是bindings.xml

<jaxws:bindings
  wsdlLocation="Your wsdl file path"
  xmlns="http://java.sun.com/xml/ns/jaxws"
  xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
  <enableWrapperStyle>true</enableWrapperStyle>
</jaxws:bindings>

真的
enableWrapperStyle=false以生成未包装的样式代码

这是您将在pom.xml中看到的配置

<configuration>
  <!-- Binding file for Wrapped style services  -->
      <defaultOptions>
          <bindingFiles>                     
              <bindingFile>
                  ${basedir}/src/main/resources/bindings.xml
              </bindingFile>
           </bindingFiles>
           <noAddressBinding>true</noAddressBinding>
       </defaultOptions>
 </configuration>

${basedir}/src/main/resources/bindings.xml
真的

嘿!看看最新的问题。尝试了一下,但不幸的是,它没有解决我的问题。当“操作”名称、“消息”名称和“元素”名称在某些形状或形式上不同时,会生成裸Web服务。要自动生成包装的客户机或服务存根,这三个元素必须相同。您的名称在.wsdl文件中不同。相应地更改.wsdl文件,使其“操作”名称、“消息”名称和“元素”名称相同,然后CXF将以包装样式生成。在手动将端口类型更改为包装并部署服务后,您是否尝试过?可能会有帮助,但我不确定。更改wsdl文件不是一个选项,因为这个文件不属于我。如果我想手动更改它,就需要向整个团队确认我所做的事情,这样当发布新的api版本(新的wsdl文件)时,有人就会知道该怎么做。如果api维护人员知道wsdl不正确,我想我可以写信给他们。
<jaxws:bindings
  wsdlLocation="Your wsdl file path"
  xmlns="http://java.sun.com/xml/ns/jaxws"
  xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
  <enableWrapperStyle>true</enableWrapperStyle>
</jaxws:bindings>
<configuration>
  <!-- Binding file for Wrapped style services  -->
      <defaultOptions>
          <bindingFiles>                     
              <bindingFile>
                  ${basedir}/src/main/resources/bindings.xml
              </bindingFile>
           </bindingFiles>
           <noAddressBinding>true</noAddressBinding>
       </defaultOptions>
 </configuration>