JAXB не может распознать наследование типов - PullRequest
3 голосов
/ 24 октября 2011

У меня есть класс, сгенерированный 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 Ответ

9 голосов
/ 24 октября 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...