为wsdl生成客户端代码,并在正文中包含更多部分

时间:2018-04-26 12:37:18

标签: java soap wsdl cxf wsimport

我目前正在使用波兰财政部的官方API开发客户端应用程序来检查NIP号码。 (https://sprawdz-status-vat.mf.gov.pl/?wsdl) 不幸的是我对他们发布的wsdl有疑问。即,有一个包含2个部分的消息。

<wsdl:message name="SprawdzNIPNaDzienZapytanie">
    <wsdl:part name="NIP" element="tns:NIP"/>
    <wsdl:part name="Data" element="tns:Data"/>
</wsdl:message>

我试图通过wsimport maven插件解析它,但客户端代码甚至没有生成,因为错误

[ERROR] operation "SprawdzNIPNaDzien": more than one part bound to body[ERROR] operation "SprawdzNIPNaDzien": more than one part bound to body

我认为没问题,我会尝试不同的工具来生成代码。因为我之前已经使用过cxf,所以我选择使用它。生成的代码很好但是当我试图调用该服务时,我确实得到了类似的错误。

SEI WeryfikacjaVAT has method sprawdzNIPNaDzien annotated as BARE but it has more than one parameter bound to body. This is invalid. Please annotate the method with annotation: @SOAPBinding(parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)

现在我想知道。有没有办法让它工作而不改变wsdl文件?由于它是不属于我的官方API,我无法纠正它。我想必须通过一种方式来操作这样的wsdl,因为SoapUI处理它就好并且不会抛出任何错误。

@Update

我试图添加Khalid提到的cxf参数,所以我的pom.xml看起来如下:

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>${cxf.version}</version>
    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration>
                <defaultOptions>
                </defaultOptions>
                <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>other.xml</wsdl>
                    </wsdlOption>
                    <wsdlOption>
                        <wsdl>${basedir}/src/main/resources/wsdl/my.wsdl</wsdl>
                        <bindingFiles>
                            <bindingFile>
                                ${basedir}/src/main/resources/wsdl/bindings.xml
                            </bindingFile>
                        </bindingFiles>
                        <noAddressBinding>true</noAddressBinding>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
        </execution>
    </executions>
</plugin>

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)而不是WRAPPED注释生成。

1 个答案:

答案 0 :(得分:1)

当parameterStyle为 Bare 时,Web方法应该只有1个参数。

  

对于文档样式的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>

但是在doc / lit / bare下显示此消息是没有意义的:

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

这是无效的,因为BP强制要求使用文档样式的Web服务,该消息最多只能包含1个元素。

这就是您的Web方法无法部署的原因。你在消息中有多个部分。 参考: https://coderanch.com/t/624936/certification/parameterStyle-Bare-web-methods-parameter

如果你想在不更改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>