Генерация Jaxb POJO с наследованием

Я хочу сгенерировать POJO, используя привязку xml с другой иерархией, которая у меня есть прямо сейчас. Теперь у меня есть xsd, как этот:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://manueldoncel.com" xmlns:tns="http://manueldoncel.com"  elementFormDefault="qualified">
    <!-- Base element that any element uses / extends  -->
    <complexType name="baseElement" abstract="true">
        <sequence>
            <element name="attributes" type="anyType"  minOccurs="0" />
        </sequence>
        <attribute name="id" type="string" />
    </complexType>

    <complexType name="Square">
        <complexContent><extension base="tns:baseElement" /></complexContent>
    </complexType>

    <complexType name="Triangle">
        <complexContent><extension base="tns:baseElement" /></complexContent>
    </complexType>

</schema>

Такой xjb;

<?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="figures.xsd" node="/xs:schema">
    <jxb:globalBindings>
      <xjc:simple />
      <xjc:superClass name="org.manuel.metadata.Figure"/>     
    </jxb:globalBindings>
  </jxb:bindings>
</jxb:bindings>

Но я хотел бы иметь лучшую иерархию с этим подходом

public abstract class Figure {
    // some methods for all the figures
}

public abstract class ThreeSideFigure extends Figure {
.... // some methods for only the Three side Figures
}

Таким образом, треугольник POJO, сгенерированный из XSD, должен простираться от ThreeSideFigure, а не от Figure.

В этом конкретном xsd я поместил только 2 цифры, но у меня может быть гораздо больше. Я хотел бы иметь возможность указать в xjb, что весь комплексный тип должен простираться от рисунка, но только некоторые из них должны простираться от ThreeSideFigure.

Вы знаете, как должен выглядеть xjb?


person Manuelarte    schedule 27.02.2014    source источник


Ответы (1)


Я не думаю, что расширения Metro JAXB RI позволят вам это сделать.

Из документации 2.2.7:

3.1.3. Расширение общего суперкласса

Настройка <xjc:superClass> позволяет указать полное имя класса Java, который будет использоваться в качестве суперкласса для всех сгенерированных классов реализации. Настройка <xjc:superClass> может выполняться только в рамках вашей настройки <jaxb:globalBindings> элемента <xs:schema>.

Тем не менее, ответ на суперинтерфейс и суперкласс XJC только для всех классов? предполагает, что вы можете сделать это с помощью сторонних расширений. . Есть некоторые подробности о плагинах в документации.

person McDowell    schedule 27.02.2014