我目前正在使用波兰财政部的官方 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/