gpt4 book ai didi

java - JAXB、抽象类和多模块项目

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:11:45 25 4
gpt4 key购买 nike

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

最佳答案

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

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

更新 1

I've played with the class list in JAXBContext.newInstance(), but that doesn't seem to solve the problem.

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


更新 2

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

继承 - xsi:type

根据您当前的映射方式,您需要确保您的 XML 如下所示,以便实例化 Imp2 实例并将其填充到 abstMain 类中的字段。

<?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;
}

有关详细信息,请参阅:

关于java - JAXB、抽象类和多模块项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12708684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com