假设我有一个jar xxx-core.jar,它包含以下类:
@XmlRootElement
@XmlSeeAlso({Imp1.class, Imp2.class})
public abstract class Abst {...}
@XmlRootElement
public class Imp1 extends Abst {...}
@XmlRootElement
public class Imp2 extends Abst {...}
public class Main {
@XmlElement
private Abst abst;
public static void load(File file) {
// unmarshal this
}
public void save(File file) {
// marshal this
}
}
到目前为止,还不错。main可以进行编组和解编,并使用了正确的abst实现。
现在,当其他人来创建另一个使用xxx-core.jar但包含以下类的项目xxx-extension.jar时会发生什么情况:
@XmlRootElement
public class ExtensionImp extends Abst {...}
并将此新实现的实例分配给main的成员变量?由于xmlseealso注释中没有显式地给出它,我如何确保extensionimp将被正确地封送/解除封送?(我在jaxbcontext.newInstance()中使用了类列表,但这似乎并不能解决问题。)
最佳答案
注释只是一种让jaxb(jsr-222)impl知道如何查看其他类的机制。或者,您可以将then包含在用于引导@XmlSeeAlso
的类中。创建JAXBContext
时,只需执行以下操作:
JAXBContext jc = JAXBContext.newInstance(Abst.class, ExtensionImp.class);
更新1
我在jaxbcontext.newInstance()中使用了类列表,但是
似乎解决不了这个问题。
这肯定能解决问题,当你这样做的时候会发生什么。
更新2
我怀疑您的问题是由于您正在解组的文档,而不是如何引导。以下内容应该会有所帮助。
继承-xsi:type
按照您当前拥有映射的方式,您需要确保您的xml看起来像下面这样,以便将
JAXBContext
的实例实例化并填充到Imp2
类的abst
字段中。<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<main>
<abst xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="imp2"/>
</main>
有关详细信息,请参见:
http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html
继承替换组
如果您希望像下面这样解组XML文档:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<main>
<imp2/>
</main>
然后需要利用
Main
注释。import javax.xml.bind.annotation.*;
@XmlRootElement
public class Main {
@XmlElementRef
Abst abst;
}
有关详细信息,请参见:
http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-substitution.html
关于java - JAXB,抽象类和多模块项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12708684/