В настоящее время я разрабатываю клиентское приложение, используя официальный API Министерства финансов Польши для проверки номеров NIP (https://sprawdz -status-vat.mf.gov.pl /? * 1003 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
Я попытался добавить параметр cxf, упомянутый Khalid, поэтому мой 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.