java - 为主体中包含更多部分的 wsdl 生成客户端代码

标签 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] 操作“SprawdzNIPNaDzien”:多于一个部分绑定(bind)到正文[错误] 操作“SprawdzNIPNaDzien”:多于一个部分绑定(bind)到正文

我想好吧,我会尝试不同的工具来生成代码。由于我之前已经使用过 cxf,所以我选择使用它。生成的代码很好,但是当我尝试调用该服务时,我确实遇到了与以前类似的错误。

SEI WeryfikacjaVAT 方法 sprawdzNIPNaDzien 注释为 BARE,但它有多个参数绑定(bind)到 body。这是无效的。请用注解标注方法:@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 注释。

最佳答案

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

With document style web services, the BP mandates that each message have zero or one part.

这是一个例子:

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

所以,这意味着参数都在 SOAP 请求中的元素内。

  • 当参数 style 被包装时,所有的都有意义 包裹在元素内的参数。
  • 当 参数样式是裸露的,所有参数都没有包裹在任何 元素。

因此,将它放在 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 的绑定(bind)文件来生成代码。

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

关于java - 为主体中包含更多部分的 wsdl 生成客户端代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50043179/

相关文章:

java - JSF commandButton 操作返回正确的值,但导航规则不适用

java - RMI 公开服务中的引用应该是 transient 的吗?

windows-phone-7 - Windows Phone 7 SOAP

c++ - 如何在 C++ 中进行 soap 调用

java - 使用合作伙伴 WSDL 创建 SFDC 机会

java - 如何在Java中更快地读取大文本文件?

java - 使用 gradle bootJar 而不是 jar 任务并且在 Jenkins 中构建失败

web-services - SoapClient 无法识别我在 WSDL 中看到的函数

c# - C# 中的 SOAP 客户端无法访问 WSDL 文件

带有 SSL 证书的 PHP SOAP 客户端