Динамическая десериализация JAXB XML (Unmarshalling) - PullRequest
1 голос
/ 18 ноября 2011

Я хочу десериализовать (демаршировать) простые POJO непосредственно из XML-строки, без какого-либо файла конфигурации (определения схемы или другого).

Мое приложение использует простой базовый абстрактный класс Field следующим образом:

public abstract class Field
{
    private final String name;
    private final Object value;

    protected Field(String name, Object value)
    {
        this.name  = name;
        this.value = value;
    }
}

, который расширяется различными другими классами, такими как

public class StringField extends Field
{
    public StringField(String name, String value)
    {
        super(name, value);
    }
}

Обратите внимание, что ни в одном из этих классов нет конструктора без аргументов.

A сериализованныйStringField POJO будет выглядеть примерно так:

<StringField>
    <name>test</name><type />
    <value>Some text</value>
</StringField>

Предполагая, что приведенный выше XML хранится в строковой переменной с именем xml, я пытаюсь использовать JAXB для десериализации, используя следующий метод:

public static Field deserialize(String xml)
{
    Field field = null;

    try
    {
        JAXBContext context = JAXBContext.newInstance(Field.class);

        javax.xml.bind.Unmarshaller um = context.createUnmarshaller();

        field = (Field)um.unmarshal(new StringReader(xml));
    }
    catch (JAXBException e)
    {
        e.printStackTrace();
    }

    return field;
}

В идеале, я бы хотел десериализовать строку XML в соответствующий Java POJO (т. Е. StringField в приведенном выше случае).

Однако я получаю исключения JAXB, поскольку у Field нет no-arg конструктор и, даже если я добавлю его туда, потому что его нельзя создать.

Но даже если я сделаю класс Field неабстрактным, значения присваиваются через tКонструктор по умолчанию для двух полей (имя, значение) является преобладающим, в отличие от фактических значений, десериализованных из строки XML.Даже если бы это сработало, я бы не получил дочерний объект (StringField), но родительский (Field).

Существует ли какой-либо общий способ динамической десериализации POJO без объявления схемы и получения реальных (дочерних) объектов с использованием JAXB?

1 Ответ

3 голосов
/ 29 мая 2013

Вы должны аннотировать свои поля

https://jaxb.java.net/2.2.6/docs/ch03.html#annotating-your-classes

С такими вещами, как: @XmlElement и @ XmlAttribute

Вот хороший урок:

http://www.vogella.com/articles/JAXB/article.html

Надеюсь, это поможет.

...