3

假设我有一个包含以下类的 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() 中的类列表,但这似乎并没有解决问题。)

4

2 回答 2

1

@XmlSeeAlso注释只是一种让您的 JAXB (JSR-222) impl 知道查看其他类的机制。或者,您可以将 then 包含在用于引导JAXBContext. 当您创建您的时JAXBContext,您只需要执行以下操作:

JAXBContext jc = JAXBContext.newInstance(Abst.class, ExtensionImp.class);

更新 1

我玩过 JAXBContext.newInstance() 中的类列表,但这似乎并不能解决问题。

这绝对应该解决问题,当你这样做时会发生什么。


更新 2

我怀疑您的问题是由于您正在解组的文档而不是您的引导方式。以下应该会有所帮助。

继承 - xsi:type

使用您当前拥有映射的方式,您需要确保您的 XML 如下所示,以便将实例Imp2化并填充到类的abst字段中Main

<?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 文档:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<main>
    <imp2/>
</main>

然后,您需要利用@XmlElementRef注释。

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Main {
    @XmlElementRef
    Abst abst;
}

有关更多信息,请参阅:

于 2012-10-03T13:33:25.727 回答
0

我使用@XmlAnyElement(lax=true). 尝试将此注释而不是@XmlElement主类。

于 2012-10-03T12:50:05.373 回答