JAXB,抽象类和多模块项目

时间:2012-10-03 12:40:16

标签: 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 {
  @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()中使用了类列表,但这似乎无法解决问题。)

2 个答案:

答案 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放入主类中。