#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 в клиентском проекте. Там проходит несколько часов впустую…