JAXB аннотация для иерархии классов - PullRequest
5 голосов
/ 17 мая 2011

Эй, У меня есть 2 класса. Когда я пытаюсь создать из них структуру XML, я получаю только корневой элемент (A). Зачем? Я использую неправильные аннотации?

@XmlRootElement(name = "a")
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class A{
    @XmlElement
    int a;

    protected A(){
    }
 }

@XmlAccessorType(XmlAccessType.FIELD)
public class B extends A{
    @XmlElement
    int b;

    protected B(){
    }
}    

1 Ответ

7 голосов
/ 17 мая 2011

Возможно, вам нужно использовать @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 в своем коде. В верхнем решении вы устанавливаете отношения один раз навсегда.

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