JAXB и абстрактные классы

Я пытаюсь использовать JAXB для распаковки некоторого XML, но получаю исключение "Невозможно создать экземпляр...". Я понимаю, почему - он пытается создать экземпляр абстрактного класса. Я хочу, чтобы он создал экземпляр определенного класса реализации. Моя цель состоит в том, чтобы иметь специфические для класса проверки методов установки. Возможно, "qux" является допустимым значением baz для BarImpl, но BarImpl2 хочет сделать что-то другое.

Часть этого я добился тем, что не аннотировал Foo, но если я аннотирую bar, все становится ужасно.

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.junit.Test;


public class JAXBTest {

    @Test
    public void test() throws javax.xml.bind.JAXBException {
        String xml = 
            "<foo>" +
            "  <bar>" +
            "    <baz>qux</baz>" +
            "  </bar>" +
            "</foo>";

        javax.xml.bind.JAXBContext context = javax.xml.bind.JAXBContext.newInstance(
                FooImpl.class,
                BarImpl.class
        );

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

        unmarshaller.unmarshal(new java.io.StringReader(xml));
    }

    @XmlRootElement(name="foo")
    public static abstract class Foo {
        @XmlElement(name="bar")
        Bar bar;
    }

    @XmlRootElement(name="bar")
    public static abstract class Bar {
        @XmlElement(name="baz")
        String baz;
    }

    public static class FooImpl extends Foo { }
    public static class BarImpl extends Bar { }
}
8
задан David Ehrmann 6 March 2012 в 08:13
поделиться