2015-03-13 2 views
0

Я пытаюсь сгенерировать классы из wsdl с помощью jaxws-maven-plugin, но получаю несогласованные результаты. Проблема эта часть одного из xsds, где вы можете увидеть, что есть вложенные элементы с тем же именем:xpath переименовать один класс в сумасшедшую иерархию

<xs:complexType name="TrafficCountsReplyData" abstract="true"> 
<xs:sequence> 
    <xs:element name="effectiveTrafficWindow" type="common:DateTimeMinutePeriod" minOccurs="1" maxOccurs="1"/> 
    <xs:element name="flows" minOccurs="0" maxOccurs="1"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="item" type="flow:Flow" minOccurs="0" maxOccurs="100"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="counts" minOccurs="0" maxOccurs="1"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="item" minOccurs="0" maxOccurs="1440"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="key" type="common:DateTimeMinutePeriod" minOccurs="1" 
             maxOccurs="1"/> 
          <xs:element name="value" minOccurs="0" maxOccurs="1"> 
           <xs:complexType> 
            <xs:sequence> 
             <xs:element name="item" minOccurs="1" maxOccurs="3"> 
              <xs:complexType> 
               <xs:sequence> 
                <xs:element name="key" type="flight:TrafficType" 
                   minOccurs="1" maxOccurs="1"/> 
                <xs:element name="value" type="flow:Counts" minOccurs="1" 
                   maxOccurs="1"/> 
               </xs:sequence> 
              </xs:complexType> 
             </xs:element> 
            </xs:sequence> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:sequence> 
</xs:complexType> 

Как вы можете видеть, там есть несколько элементов с именем item. Это приводит к нескольким внутренним классам с одним и тем же именем внутри одного класса. TrafficCountsReplyData

Так что я пытаюсь собрать файл привязки, который переименовал бы один из них. Когда я пытаюсь переименовать в counts элемент внешней item с помощью этого:

<jaxb:bindings node="//xs:complexType[@name='TrafficCountsReplyData']//xs:element[@name='counts']//xs:element[@name='item']"> 
     <jaxb:class name="Lulz"/> 
    </jaxb:bindings> 

Я получаю следующее сообщение об ошибке:

[ERROR] оценка XPath из «// хз: ComplexType [@ имя =» TrafficCountsReplyData '] // xs: element [@ name =' counts '] // xs: element [@ name =' item '] "приводит к слишком большому (2) целевым узлам

Когда я создаю привязку xpath выражение для внутреннего типа:

<jaxb:bindings node="//xs:complexType[@name='TrafficCountsReplyData']//xs:element[@name='counts']//xs:element[@name='item']//xs:element[@name='value']//xs:element[@name='item']"> 

Затем я получаю следующее сообщение об ошибке:

java.lang.IllegalArgumentException: Illegal цикл наследования классов. Внешний класс Lulz не может быть подклассом из внутреннего класса: Lulz

Я не могу понять, как это сделать. Откуда происходит наследование? В элементе flows есть еще один item, но это не должно соответствовать Xpath. Без файла привязки я могу генерировать источники. У меня есть правильная схема в файле привязки, потому что я могу, например, переименовать класс, сгенерированный родительским элементом.

ответ

0

Я нашел решение здесь: JAXB Customizations With a Poorly Formed WSDL

мне пришлось добавить /xs:complexType в конце Xpath. Я думаю, это потому, что корень класса на самом деле является complexType и не включает элемент xs:. Так было вот так:

<jaxb:bindings node="//xs:complexType[@name='TrafficCountsReplyData']//xs:element[@name='counts']/xs:complexType/xs:sequence/xs:element[@name='item']/xs:complexType"> 
     <jaxb:class name="Lulz"/> 
</jaxb:bindings> 

Теперь я могу сгенерировать классы и скомпилировать их.

1

ммм У меня была аналогичная проблема, но со свойствами .. я не ahve полный XSD, чтобы проверить, но если вы хотите изменить OUTER тег элемента во что-то еще, попробуйте это одно:

<?xml version="1.0"?> 
    <jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
     xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
     jxb:extensionBindingPrefixes="xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
     <jxb:bindings schemaLocation="../yourlocation/yourschema.xsd" version="1.0"> 
      <!-- Customise the package name --> 

      <jxb:schemaBindings> 
       <jxb:package name="whatyouwant.something"/> 
      </jxb:schemaBindings> 

      <!-- rename the value element --> 
      <jxb:bindings node="//xs:complexType[@name='TrafficCountsReplyData']//xs:sequence//xs:element[@name='counts']//xs:complexType//xs:sequence//xs:element[@name='item']"> 
        <jaxb:class name="Lulz"/> 
      </jxb:bindings> 
     </jxb:bindings> 
    </jxb:bindings> 

Если это не работает, если вы можете раскрыть xml, я должен помочь вам в этом (в отпуске до понедельника на случай), но подумайте, что вы даете неправильный путь, отскакивая несколько " субэлемент "в вашем выражении xpath. Дайте мне знать.

+0

Если я правильно понял, вы добавили неназванные элементы в xpath, не так ли? Я пробовал это, как и вы, но проблема такая же ... слишком много целевых узлов. И если я положу туда полный путь к самому внутреннему «элементу», я все равно получаю «Незаконный цикл наследования классов».Я также попробовал одноразовый Xpath и создал запись привязки для всех вхождений «item», но это также не помогло. Я не уверен, что могу раскрыть XSD, но полная схема в любом случае имеет размер 3 МБ, и у меня есть другие файлы привязки, фиксирующие другие проблемы ... – NeplatnyUdaj