Настройки JAXB с плохо сформированным WSDL - PullRequest
11 голосов
/ 25 октября 2011

Это сводит меня с ума. У меня есть схема, встроенная в WSDL, которая нуждается в настройке, потому что WSIMPORT выдает следующую ошибку

[ERROR] Complex type and its child element share the same name "DomainsMap".
Use a class customization to resolve this conflict.
line 878 of file:/C:/jaxws-ri/bin/ArtesiaWebServices.wsdl

1) У меня нет контроля над этим WSDL, так как я создаю первого клиента WSDL, и я ожидаю, что он будет пересматривать версии без каких-либо официальных консультаций или выпуска для меня. 2) Это больше не допустимо, чтобы вручную исправить это столкновение имен, потому что мне нужно включить конструкцию заглушек в автоматизированную цепочку сборки.

Я должен использовать внешний файл настроек. Я просто не могу понять, как заставить работать настройку.

Вот оскорбительный фрагмент WSDL:

<wsdl:definitions>
    <wsdl:types>
       <xs:schema>
        .
        .
        .
       <xs:complexType final="extension restriction" name="domainsMap">
         <xs:sequence>
           <xs:element name="domainsMap">
             <xs:complexType>
               <xs:sequence>
                 <xs:element maxOccurs="unbounded" minOccurs="0" name="entry">
                   <xs:complexType>
                     <xs:sequence>
                       <xs:element minOccurs="0" name="key" type="xs:string"/>
                        <xs:element minOccurs="0" name="value" type="tns:domainValueMap"/>
                     </xs:sequence>
                   </xs:complexType>
                 </xs:element>
               </xs:sequence>
             </xs:complexType>
           </xs:element>
         </xs:sequence>
       </xs:complexType>

Это было бы отличным шансом для вас улучшить свои навыки JAXB. Любая помощь будет принята с благодарностью.

Я часами смотрел на документацию по jaxb, но все равно не повезло. Я могу предложить весь WSDL, если это будет необходимо. Кто-нибудь может помочь?

Ответы [ 2 ]

17 голосов
/ 25 октября 2011

Ну, сегодня утром я пришел на работу и смог понять это.Иногда лучше всего просто уйти от проблемы и вернуться со свежей головой.Вот решение, которое сработало для меня:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxws:bindings
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  wsdlLocation="ArtesiaWebServices.wsdl">

    <enableWrapperStyle>true</enableWrapperStyle>
    <enableAsyncMapping>false</enableAsyncMapping>
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainsMap']/xs:sequence/xs:element[@name='domainsMap']/xs:complexType">
        <!-- This binding will fix the domainsMap inner element called domainsMap. sheesh, who names stuff like that?! -->
        <jaxb:class name="DomainsMapElement"/>
    </jaxws:bindings>
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainValueMap']/xs:sequence/xs:element[@name='domainValueMap']/xs:complexType">
        <!-- This binding will fix the domainValueMap inner element called domainValueMap. sheesh, who names stuff like that?! -->
        <jaxb:class name="DomainValueMapElement"/>
    </jaxws:bindings>
</jaxws:bindings>

Я использую указанный выше файл внешней привязки с помощью инструмента wsimport в следующей команде.

Важные сведения об этом файле привязки:

  • Используется пространство имен для привязок jaxws.Это единственный способ заставить выбор узла работать правильно
  • Выбор узла должен заканчиваться на / xs: complexType.Если вы остановитесь на выборе имени элемента, компилятор выдаст ошибки.

    wsimport -d Генерируемый -keep -b ArtesiaExternalBinding.xml ArtesiaWebServices.wsdl

Используемые параметры:
-d Генерируемый указывает выходной каталог (в данном случае папку с именем «Сгенерировано»)
-b ArtesiaExternalBinding.xml указывает компилятору JAXB использовать файл привязки,
-keep сохранить заглушки (я просто использую заглушки для проверки)

наконец, я обнаружил, что это самый полезный кусок информации: документы java.netв настройках jaxws

Это то, что привело меня к вложению настроек jaxb в теги jaxws.Спасибо за ссылку Петру Гардя

3 голосов
/ 25 октября 2011

Не понятно, что вы пробовали или нет, но я бы сделал следующее: - использовать опцию -b в командной строке wsimport (документ доступен здесь ). - информацию о файлах привязки можно найти здесь ; - Глубокий обзор с примерами того, как настроить, чтобы избежать конфликтов имен: здесь . Я привожу здесь выдержку - она ​​должна решить вашу проблему.

<jxb:schemaBindings>
      <jxb:package name="primer.myPo">
         <jxb:javadoc>
   <![CDATA[<body> Package level documentation for generated package primer.myPo.</body>]]>
         </jxb:javadoc>
      </jxb:package>
      <jxb:nameXmlTransform>
          <jxb:elementName suffix="Element"/>
      </jxb:nameXmlTransform> 
</jxb:schemaBindings> 
...