7
いくつかのXMLのアンマーシャリングにJAXBを使用しようとしていますが、「インスタンスを作成できません...」という例外が発生しています。私はなぜそれが抽象クラスのインスタンスを作成しようとしているのか理解しています。私が望むのは、特定の実装クラスのインスタンスを作成することです。私の目標は、セッターメソッドのクラス固有のチェックを行うことです。おそらく "qux"はBarImplの有効なbaz値ですが、BarImpl2は何か他のことをしたいと考えています。JAXBと抽象クラス
私はFooに注釈をつけないことでそこの途中にいましたが、私がバーに注釈を付けると、ものが醜くなりました。
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 { }
}
それが欠けている一つのことは、私はBarImpl2を加えた場合、(Fooの中)バーはすでにBarImplとしてマークされていることです。 –
このユースケースを処理するために、@ XmlElementsを使用するように答えを更新しました。 –
それは働いた! BarImpl2の実装者はFooのアノテーションを変更する必要があるだけですが、それは煩わしいことです。 –