Я пытаюсь использовать 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 { }
}