我的基于 RCP 的项目中有多个插件。我希望能够在一个插件中定义 @XMLElements,然后可以从核心插件中编码/取消编码。为此,我在加载插件后立即报告可序列化的类。但是,JAXBContext 似乎不支持动态添加类。我通过将所有类保存在一个列表中并在每次基于该列表报告一些新类时创建一个新的 JAXBContext 来实现一个变通方法,但这个解决方案并不是很好。
有更好的方法吗?
最佳答案
您绝对不能将类动态添加到 JAXBContext。这与维护 JAXBContext 的线程安全有关。
我最近在 my blog 上发布了一个示例解释如何利用 @XmlAnyElement 注释生成可能具有不同负载的通用消息:
根对象
body 属性的根元素将由该对象 @XmlRootElement 控制。
package message;
import javax.xml.bind.annotation.*;
@XmlRootElement@XmlAccessorType(XmlAccessType.FIELD)
public class Message {
@XmlAttribute
private String to;
@XmlAttribute
private String from;
@XmlAnyElement
private Object body;
}
创建 JAXBContext
可以在上下文路径上创建 JAXBContext,而不是在类数组上创建 JAXBContext:
JAXBContext.newInstance("message:customer:product");
此上下文路径包括 3 个由冒号“:”字符分隔的包名称。在这些包中的每一个中,我们都需要包含一个名为 jaxb.index 的文件和一个文件列表。下面是客户包中 jaxb.index 文件的示例:
Address
Customer
当我们想要向我们的框架添加一个模型来表示订单时,我们会将我们的 JAXBContext 创建扩展为 like(此字符串可以作为变量传入):
JAXBContext.newInstance("message:customer:product:order");
关于java - 动态添加类型到 jaxb 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3628306/