Java 向jaxb上下文动态添加类型

Java 向jaxb上下文动态添加类型,java,plugins,jaxb,rcp,Java,Plugins,Jaxb,Rcp,我在基于RCP的项目中有多个插件。我希望能够在一个插件中定义@XMLElements,然后可以从核心插件封送/取消封送。为此,我在加载插件后立即报告可序列化的类。但是,JAXBContext似乎不支持动态添加类。我实现了一种变通方法,将所有类保存在一个列表中,并在每次根据该列表报告一些新类时创建一个新的JAXBContext,但这种解决方案并不太好 有更好的方法吗?您绝对不能将类动态添加到JAXBContext。这与维护JAXBContext的线程安全有关 我最近发布了一个示例,解释了如何利用@

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


有更好的方法吗?

您绝对不能将类动态添加到JAXBContext。这与维护JAXBContext的线程安全有关

我最近发布了一个示例,解释了如何利用@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的文件和一个文件列表。下面是customer包中jaxb.index文件的示例:

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

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