В настоящее время я разрабатываю клиентское приложение с использованием официального 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 обрабатывает его просто отлично и не вызывает никаких ошибок.
@Обновлять
Я попытался добавить параметр 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.
Когда параметрStyle равен Голый, веб-методы должны иметь только 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.
Поэтому имеет смысл разместить это в 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 требует, чтобы с веб-сервисом в стиле документа сообщение должно иметь не более 1 элемента.
По этой причине ваш веб-метод не будет развернут. у вас более одной части сообщения. Справка : 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>
Веб-службы BARE создаются, когда имя «операции», имя «сообщения» и имя «элемента» различаются по той или иной форме или форме. Чтобы автоматически создавать заглушки клиента или службы как ЗАВЕРШЕННЫЕ, все эти три элемента должны быть одинаковыми. ваши имена другие в файле .wsdl. Измените свой .wsdl файл соответствующим образом, чтобы его имя «операции», имя «сообщения» и имя «элемента» совпадали, тогда CXF будет генерировать в стиле Wrapped. Пробовали ли вы вручную изменить тип порта на WRAPPED и развернуть службу? может быть это помогает, но я в этом не уверен.
Изменение файла wsdl невозможно, так как этот файл мне не принадлежит. Если я захочу изменить его вручную, это потребует подтверждения всей командой того, что я сделал, поэтому, когда будет опубликована новая версия api (как и новый файл wsdl), кто-то будет знать, что делать. Думаю, я могу написать обслуживающему персоналу api, если они знают, что wsdl неверен.
Привет! Взгляните на обновленный вопрос. Попробовал, но, к сожалению, мою проблему это не решило.