Возможно, вам нужно использовать @XmlSeeAlso
аннотацию в вашем высшем классе:
@XmlSeeAlso(B.class)
@XmlRootElement(name = "a")
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class A{
Я написал «вероятно», потому что это зависит от того, как вы настраиваете свой JAXB-контекст. По сути, вы должны убедиться, что все классы, которые должны быть сериализованы, известны JAXB. Если ваш B
класс не упоминается нигде (например, как тип свойства одного из классов, который
уже известны JAXB), то у JAXB нет шансов узнать, как сериализовать экземпляры B
. Цель аннотации @XmlSeeAlso
состоит в том, чтобы JAXB изучал и эти перечисленные классы.
UPDATE:
В качестве альтернативы вы можете предоставить список всех подклассов при создании объекта JAXBContext
, используя JAXBContext.newInstance(Class...)
, например ::
JAXBContext.newInstance(A.class, B.class);
вместо
JAXBContext.newInstance(A.class);
что вы, вероятно, уже делаете.
Но, на мой взгляд, это худшее решение, потому что оно заставляет вас думать о связанных классах каждый раз, когда вы используете JAXB в своем коде. В верхнем решении вы устанавливаете отношения один раз навсегда.