JAXB не распознает наследование типов

#java #xml #inheritance #jaxb

#java #xml #наследование #jaxb

Вопрос:

У меня есть класс, созданный JAXB, с коллекцией с абстрактным типом COBJECT.

У COBJECT есть несколько потомков, и у этих потомков также есть абстрактные потомки. Фрагмент из иерархии классов выглядит следующим образом:

 COBJECT (abstract)
|
|---CDEFINEDOBJECT
    |
    |--CDOMAINTYPE (abstract)
       |
       |---CCODEPHRASE 
  

Когда я добавляю объект CCODEPHRASE в коллекцию с типом COBJECT , например

 protected List<COBJECT> children;
  

JAXB пытается создать COBJECT, который является абстрактным типом, и это не удается. Я пытался добавить

 @XmlElementRefs({
        @XmlElementRef(type = ARCHETYPEINTERNALREF.class),
        @XmlElementRef(type = CONSTRAINTREF.class),
        @XmlElementRef(type = CDEFINEDOBJECT.class),
        @XmlElementRef(type = ARCHETYPESLOT.class),
        @XmlElementRef(type = CCODEPHRASE.class)        
    })
protected List<COBJECT> children;
  

перед дочерним полем, но в ответ я получил исключение «Тип или любой из его подклассов неизвестен».

Ввод XML содержит XSI:TYPE= … атрибут. Как мне заставить JAXB обрабатывать эту структуру наследования?

Ответ №1:

Вам необходимо убедиться, что JAXBContext он знает о родительском классе и всех подтипах. Это можно сделать, передав все при создании JAXBContext.

 JAXBContext.createContext.newInstance(Parent.class, Child1.class, Child2.class);
  

Или вы можете @XmlSeeAlso использовать аннотацию. Это позволяет указать все дочерние классы, так что вам нужно только вводить корень при создании JAXBContext:

 @XmlSeeAlso({Child1.class, Child2.class}) {
public class Parent {
}
  

Для получения дополнительной информации о JAXB и наследовании

Комментарии:

1. Спасибо, на самом деле проблема возникла из-за моей крайней глупости 🙂 По-видимому, я забыл обновить сгенерированные файлы классов java в клиентском проекте. Там проходит несколько часов впустую…