【问题标题】:Generating client side code for wsdl with more parts in a body为 wsdl 生成客户端代码,其中包含更多部分
【发布时间】:2018-04-26 12:37:17
【问题描述】:

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

<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,我无法更正它。我想必须通过某种方式来使用诸如 SoapUI 之类的 wsdl 来处理它并且不会引发任何错误。

@更新

我尝试添加 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注释生成端口。

【问题讨论】:

    标签: java soap wsdl cxf wsimport


    【解决方案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 个元素。

    这就是您的网络方法无法部署的原因。您在消息中有多个部分。 参考 : 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>
    

    【讨论】:

    • 嘿!看看更新的问题。试一试,但不幸的是它没有解决我的问题。
    • 当“操作”名称、“消息”名称和“元素”名称在某些形状或形式上不同时,会生成 BARE Web 服务。要将您的客户端或服务存根自动生成为 WRAPPED,所有这三个元素必须相同。你的名字在 .wsdl 文件中是不同的。相应地更改您的 .wsdl 文件,使其“操作”名称、“消息”名称和“元素”名称相同,然后 CXF 将以 Wrapped Style 生成。手动将端口类型更改为 WRAPPED 并部署服务后,您是否尝试过?可能有帮助,但我不确定。
    • 更改 wsdl 文件不是一个选项,因为该文件不属于我。如果我想手动更改它,则需要向整个团队确认我所做的事情,所以当新的 api 版本发布时(新的 wsdl 文件也会发布),有人会知道该怎么做。如果他们知道 wsdl 不正确,我想我可以写信给 api 维护者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 2018-10-11
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 2018-03-14
    相关资源
    最近更新 更多