假设我有一个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/

10-10 03:03