我目前正在使用波兰财政部的官方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注释生成。
答案 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>