Генерация клиентского кода для wsdl с большим количеством частей в теле - PullRequest
0 голосов
/ 26 апреля 2018

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

1 Ответ

0 голосов
/ 28 апреля 2018

Если параметрStyle равен Голый , веб-методы должны иметь только 1 параметр.

С помощью веб-сервисов в стиле документа 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 требует, чтобы в веб-службе в стиле документа сообщение содержало не более 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>
...