假设我有一个带有以下类的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()中使用了类列表,但这似乎无法解决问题。)
答案 0 :(得分:1)
@XmlSeeAlso
注释只是一种让你的JAXB(JSR-222)impl知道查看其他类的机制。或者,您可以在用于引导JAXBContext
的类中包含。当您创建JAXBContext
时,您只需要执行以下操作:
JAXBContext jc = JAXBContext.newInstance(Abst.class, ExtensionImp.class);
更新1
我在JAXBContext.newInstance()中使用了类列表,但是那样 似乎没有解决问题。
这绝对可以解决问题,当你这样做时会发生什么。
更新2
我怀疑您的问题是由于您要解组的文档,而不是您的引导方式。以下内容应该有所帮助。
继承 - xsi:输入
使用当前拥有映射的方式,您需要确保XML看起来如下所示,以便将Imp2
实例实例化并填充到{{1}的abst
字段中}。class。
Main
有关详细信息,请参阅:
继承替换组
如果您希望解组XML文档,如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<main>
<abst xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="imp2"/>
</main>
然后您需要利用<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<main>
<imp2/>
</main>
注释。
@XmlElementRef
有关详细信息,请参阅:
答案 1 :(得分:0)
我使用@XmlAnyElement(lax=true)
解决了类似的问题。尝试将此注释而不是@XmlElement
放入主类中。