Разрешить конфликт в именах классов при конвертации из WSDL в Java - PullRequest
0 голосов
/ 18 января 2019

Я конвертирую WSDL в Java с помощью CXF. Когда ключ -autoNameResolution включен, CXF создает много файлов с одинаковым содержимым. Есть ли способ избежать этого?

Чтобы избежать вложенных статических классов, я включил <jaxb:globalBindings localScoping="toplevel">. Как видно из WSDL, на элемент «Apple» ссылаются три раза. К сожалению, я не могу изменить WSDL. CXF создает Apple.java, Apple2.java, Apple3.java соответственно или вылетает, если не установлен флаг -autoNameResolution.

<xs:element name="Forest">
  <xs:complexType>
    <xs:sequence>
      <xs:element maxOccurs="99" minOccurs="0" name="Apple">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Size" type="xsd:string" />
            <xs:element name="Color" type="xsd:string" />
            <xs:element name="Taste" type="xsd:string" />
          </xs:sequence>
        </xs:complexType>

      </xs:element>
      <xs:element minOccurs="0" name="TreeOne">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Branch1" type="xsd:string">
            </xs:element>
            <xs:element maxOccurs="99" minOccurs="0" name="Apple">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Size" type="xsd:string" />
                  <xs:element name="Color" type="xsd:string" />
                  <xs:element name="Taste" type="xsd:string" />
                </xs:sequence>

              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element minOccurs="0" name="TreeTwo">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="BranchTwo" type="xsd:string">
            </xs:element>
            <xs:element maxOccurs="99" minOccurs="0" name="Apple">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Size" type="xsd:string" />
                  <xs:element name="Color" type="xsd:string" />
                  <xs:element name="Taste" type="xsd:string" />
                </xs:sequence>

              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Есть ли способ научить wsdl2java не создавать Apple2.java и Apple3.java и ссылаться на Apple.java во всех трех случаях? С привязками я мог бы поменять имя на что-то другое, например Apple2-> Peach , Apple3-> Watermelon , но это не то, что я ищу. Может быть очевидно, что все три яблока имеют одинаковый набор полей, и на самом деле одинаковы? Есть ли способ решить это? Может быть какой-нибудь плагин рефакторинга, который рефакторинг кода, сгенерированного cxf?

1 Ответ

0 голосов
/ 21 января 2019

Вы можете заставить JAXB / XJC повторно использовать существующие классы, используя настройку jaxb:class/@ref. Нечто подобное:

<jaxb:class ref="com.acme.foo.Apple"/>

Где com.acme.foo.Apple - это FQCN одного из сгенерированных Apple классов. Свяжите это с двумя другими xs:complexType, и JAXB будет повторно использовать существующий класс вместо того, чтобы генерировать ту же самую вещь снова.

У меня нет большого опыта в настройке WSDL, поэтому, к сожалению, я не могу указать вам точный синтаксис привязки в этом случае.

...