Java JAXB、抽象类和多模块项目
假设我有一个包含以下类的JAR xxx-core.JAR:Java JAXB、抽象类和多模块项目,java,jaxb,Java,Jaxb,假设我有一个包含以下类的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 { @X
@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进行编组和解编组,并使用正确的ABS实现
现在,当其他人出现并创建另一个使用xxx-core.jar但包含以下类的项目xxx-extension.jar时,会发生什么情况:
@XmlRootElement
public class ExtensionImp extends Abst {...}
并将此新实现的实例分配给Main的成员变量?由于XmlSeeAllow注释中没有明确给出它,如何确保ExtensionImp被正确封送/取消封送?(我在JAXBContext.newInstance()中使用了类列表,但这似乎没有解决问题。)我使用
@xmlanyement(lax=true)
解决了类似的问题。尝试将此注释而不是@xmlement
放入主类 注释@xmlseea
只是一种机制,让您的JAXB(JSR-222)impl知道如何查看其他类。或者,您可以只在用于引导JAXBContext
的类中包含then。创建JAXBContext
时,只需执行以下操作:
JAXBContext jc = JAXBContext.newInstance(Abst.class, ExtensionImp.class);
更新1 我在JAXBContext.newInstance()中使用了类列表,但是 似乎解决不了问题 这肯定会解决问题,当你这么做的时候会发生什么
更新2 我怀疑您的问题是由于您正在解组的文档,而不是如何引导。以下内容应该会有所帮助 继承-xsi:type 按照您当前拥有映射的方式,您需要确保您的XML如下所示,以便实例化
Imp2
的实例并将其填充到Main
类上的abs
字段中
继承替换组
如果您希望按如下方式解组XML文档:
有关更多信息,请参阅:
(注意:我实际上还没有2个项目;这个问题更具前瞻性……)我在抽象类上注释了XMLSee,并将这两个子类作为参数添加到newInstance()。我得到一个UnmarshaleException:无法创建带有链接异常[java.lang.InstantiationException]的Abs-实例。我还应该注意,在我的特殊情况下,成员实际上是一个用XmlElementWrapper注释的列表(也用XmlElement尝试过)。(我尝试了一个测试,我只放了一个实例而不是列表,但结果相同。)@KelseyRider-我再次更新了我的答案。我怀疑您试图解组的文档与您的映射不匹配。还可以尝试将模型编组为XML,以查看它是否与正在使用的输入匹配。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<main>
<imp2/>
</main>
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Main {
@XmlElementRef
Abst abst;
}