2012-01-20 5 views
5

Это, казалось бы, можно распаковать два различныхjaxb объектов с тем же именем .объектов JAXB с таким же именем

Существует Bar класс ...

public abstract Bar { 
    private @XmlElement String val; 
} 

.. с двумя реализациями (конструкторы и т.д. опущены):

@XmlRootElement(name="bar") 
public class BarA extends Bar { } 

@XmlRootElement(name="bar") 
public class BarB extends Bar { 
    private @XmlElement(required=true) String type; 
} 

Наконец, я хочу маршализацию список Bar документов XML, аналогичный приведенному ниже

<bars> 
    <bar> 
    <val>1</val> 
    </bar> 
    <bar> 
    <val>1</val> 
    <type>2</type> 
    </bar> 
</bars> 

Список wra pped в классе, использующей @XmlAnyElement

@XmlRootElement 
public class Bars { 

    @XmlMixed 
    @XmlAnyElement(lax = true) 
    @XmlElementRefs({@XmlElementRef(BarA.class), @XmlElementRef(BarB.class)}) 
    private List<Bar> bars; 
} 

Однако я, кажется, только получить экземпляры либоBarA или BarB, в зависимости от того является последний элемент в @XmlElementRefs цепи.

Тестирование Код:

String xml = ... 
JAXBContext jc = JAXBContext.newInstance(Bars.class); 
ByteArrayInputStream in = new ByteArrayInputStream(xml.getBytes()); 
Bars bars = (Bars) jc.createUnmarshaller().unmarshal(in); 
for (Bar bar : bars.getBars()) { 
    System.out.println(bar.getClass()); 
} 

Я не думаю, что XmlAdapter предложил в JAXB @XmlElements, different types but same name? бы neccesarily быть единственным подходом либо.

ответ

2

Действительно, первое, что я постараюсь сделать, это устранить источник проблемы - наличие двух разных классов JAXB с тем же именем. Подобная ситуация неизбежно вызовет головные боли, для вас и для людей, которые должны поддерживать ваш код.

Если это невозможно ... Возможно, вы могли бы написать еще один подкласс под названием EveryBar и всегда без него. EveryBar будет содержать все поля каждого другого подкласса Bar. Затем у вас будет шаг последующей обработки на дереве объектов, который будет проверять EveryBar и заменять его на экземпляр любого типа. Да, это уродливое решение, но оно немного хуже, чем у вашей ссылки.

Смежные вопросы