Java JAXB、抽象类和多模块项目

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

假设我有一个包含以下类的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进行编组和解编组,并使用正确的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;
}