xpath переименовать отдельный класс в сумасшедшей иерархии

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

<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

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

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

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

[ОШИБКА] Оценка XPath для "//xs:complexType[@name='TrafficCountsReplyData']//xs:element[@name='countts]]//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: недопустимый цикл наследования классов. Внешний класс Lulz не может быть подклассом из внутреннего класса: Lulz

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

2 ответа

Решение

Я нашел решение здесь: настройки JAXB с плохо сформированным 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>

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

Ммм У меня была похожая проблема, но со свойствами. У меня нет полного 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. Дай мне знать.

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