动态地将类型添加到jaxb上下文

时间:2010-09-02 14:52:03

标签: java plugins jaxb rcp

我在基于RCP的项目中有多个插件。我希望能够在一个插件中定义@XMLElements,然后可以从核心插件封送/取消封送。为此,我会在加载插件后立即报告可序列化的类。但是,JAXBContext似乎不支持动态添加类。我通过在列表中保存所有类并在每次基于该列表报告一些新类时创建新的JAXBContext来实现解决方法,但是这个解决方案并不是很好。

有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

您绝对无法动态地向JAXBContext添加类。这与维护JAXBContext的线程安全性有关。

我最近在my blog上发布了一个示例,解释了如何利用@XmlAnyElement批注生成可能具有不同有效负载的通用消息:

根对象

body属性的root元素将由对象@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.in​​dex的文件和一个文件列表。以下是客户包中jaxb.in​​dex文件的示例:

Address
Customer 

当我们想要添加一个模型来向我们的框架表示订单时,我们会将我们的JAXBContext创建扩展为like(这个String可以作为变量传入):

JAXBContext.newInstance("message:customer:product:order");