サブタイプがBeanChild1
の単純なクラスBean1
があります。JAXBリストの@XmlElementタイプを無効にします
@XmlRootElement(name="bean")
@XmlAccessorType(XmlAccessType.PROPERTY)
public static class Bean1
{
public Bean1()
{
super();
}
private List<BeanChild1> childList = new ArrayList<>();
@XmlElement(name="child")
public List<BeanChild1> getChildList()
{
return childList;
}
public void setChildList(List<BeanChild1> pChildList)
{
childList = pChildList;
}
}
public static class BeanChild1 { ... }
私はクラスのオーバーライドを試みて、リストのタイプを変更しようとしています。 新しい子クラス(BeanChild2
)は前の子クラス(つまりBeanChild1
)まで拡張されています。
public static class Bean2 extends Bean1
{
public Bean2()
{
super();
}
@Override
@XmlElement(name="child", type=BeanChild2.class)
public List<BeanChild1> getChildList()
{
return super.getChildList();
}
}
public static class BeanChild2 extends BeanChild1 { }
だから、ここで私はそれをテストする方法です:
public static void main(String[] args)
{
String xml = "<bean>" +
" <child></child>" +
" <child></child>" +
" <child></child>" +
"</bean>";
Reader reader = new StringReader(xml);
Bean2 b2 = JAXB.unmarshal(reader, Bean2.class);
assert b2.getChildList().get(0) instanceof BeanChild2; // fails
}
テストでは、このリストには、まだBeanChild1
のチャイルズが含まれていることを明らかにしました。
childList
フィールドにBeanChild2
インスタンスを強制的に挿入するにはどうすればよいですか。
簡単な解決策がない場合、(...例えばXmlAdapter
S、Unmarshaller.Listener
、親または子クラスで、おそらく追加の注釈を使用して)より創造的なソリューションを投稿すること自由に感じが