Генерация клиентского кода для wsdl с большим количеством частей в теле

В настоящее время я разрабатываю клиентское приложение с использованием официального 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.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
1 448
1

Ответы 1

Когда параметр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>

Привет! Взгляните на обновленный вопрос. Попробовал, но, к сожалению, мою проблему это не решило.

Dcortez 30.04.2018 07:06

Веб-службы BARE создаются, когда имя «операции», имя «сообщения» и имя «элемента» различаются по той или иной форме или форме. Чтобы автоматически создавать заглушки клиента или службы как ЗАВЕРШЕННЫЕ, все эти три элемента должны быть одинаковыми. ваши имена другие в файле .wsdl. Измените свой .wsdl файл соответствующим образом, чтобы его имя «операции», имя «сообщения» и имя «элемента» совпадали, тогда CXF будет генерировать в стиле Wrapped. Пробовали ли вы вручную изменить тип порта на WRAPPED и развернуть службу? может быть это помогает, но я в этом не уверен.

Khalid Shah 02.05.2018 11:51
Посмотри на это
Khalid Shah 02.05.2018 11:54

Изменение файла wsdl невозможно, так как этот файл мне не принадлежит. Если я захочу изменить его вручную, это потребует подтверждения всей командой того, что я сделал, поэтому, когда будет опубликована новая версия api (как и новый файл wsdl), кто-то будет знать, что делать. Думаю, я могу написать обслуживающему персоналу api, если они знают, что wsdl неверен.

Dcortez 04.06.2018 16:44

Другие вопросы по теме