Inheritance 在使用JAXB时,如何使XML只包含子类的标记?

Inheritance 在使用JAXB时,如何使XML只包含子类的标记?,inheritance,jaxb,Inheritance,Jaxb,我有一些Java类扩展了一个公共超类。我希望使用JAXB封送/解封送它们,而不在XML表示中看到超类标记。包含超类的模块不知道当前上下文中可用的子类 以下是我正在尝试做的事情和我的方法的一个最小示例: XML示例: 福 这应该是一个等效的Java表示,其中根有一个类型为超类的成员,它是实例的父级: Root根=新根(); 实例实例=新实例(); 实例.setMember(“foo”); root.setSuperclass(实例); 我主要关心的是从XML表示转到Java对象。请注意,我明

我有一些Java类扩展了一个公共超类。我希望使用JAXB封送/解封送它们,而不在XML表示中看到超类标记。包含超类的模块不知道当前上下文中可用的子类

以下是我正在尝试做的事情和我的方法的一个最小示例:

XML示例:

这应该是一个等效的Java表示,其中
有一个类型为
超类
的成员,它是
实例
的父级:

Root根=新根();
实例实例=新实例();
实例.setMember(“foo”);
root.setSuperclass(实例);
我主要关心的是从XML表示转到Java对象。请注意,我明确不想在XML文件中编写超类标记,因此类似于
的内容对我来说是没有选择的

我目前的执行情况:

@XmlRootElement
类根{
私有超类;
@XmlAnyElement
超类getSuperclass(){return Superclass;}
void setSuperclass(Superclass Superclass){this.Superclass=Superclass;}
}
@XmlJavaTypeAdapter(ValueAdapter.class)
类超类{}
@XmlRootElement(name=“instance”)
类实例扩展了超类{
私有字符串成员;
@XmlElement
公共字符串getMember(){return member;}
public void setMember(字符串成员){this.member=member;}
}
类ValueAdapter扩展了XmlAdapter{
@凌驾
公共对象封送处理(超类v){
返回v;
}
@凌驾
公共超类解组(对象v){
元素=(元素)v;
if(element.getNodeName().equals(“实例”)){
实例实例=新实例();
setMember(element.getTextContent());
返回实例;
}
else抛出新的IllegalArgumentException();
}
}
在本例中,我为
实例
硬编码了
解组
方法,但稍后它将访问一个可以注册多个子类的服务

上述方法是可行的,但看起来完全错误。通过深入查看节点来手动解组子类对象真的很难看。毕竟,我不是在使用JAXB来隐藏这种XML树遍历吗?如果子类有多个比纯字符串更复杂的成员,情况会变得更糟。
我对JAXB还很陌生,所以我认为我要么误用了框架,要么忽略了一些显而易见的东西。有什么建议吗?

我毕竟找到了一个合理的解决办法。这个想法实际上是让JAXB继续发挥它的魔力,但从实例作为新的根元素开始:

public超类unmarshal(objectv)抛出jaxbeexception{
元素=(元素)v;
JAXBContext jc=JAXBContext.newInstance(Instance.class);
Unmarshaller Unmarshaller=jc.createUnmarshaller();
返回unmarshaller.unmarshal(元素,实例.class).getValue();
}
当然,在实际应用程序中创建新上下文的成本不应每次都重做,但上下文将由了解所有可用实例的提供者从外部提供,如下所示:

public超类unmarshal(objectv)抛出jaxbeexception{
元素=(元素)v;
String tag=element.getNodeName();

类实际上,有一个更简单的解决方案,不需要任何手动干预,即
@xmlementref

@XmlRootElement
class Root {
    private Superclass superclass;

    @XmlElementRef
    Superclass getSuperclass() { return superclass; }
    void setSuperclass(Superclass superclass) { this.superclass = superclass; }
}
超类
不需要任何注释,特别是不需要转换器