gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:16:29 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com