2010-09-02 2 views
2

У меня есть несколько плагинов в моем проекте на основе RCP. Я хочу иметь возможность определять @XMLElements в одном подключаемом модуле, который затем может быть маршалирован/неархалирован из основного плагина. Для этого я сообщаю классы, которые могут быть сериализованы, как только загружается плагин. Однако динамически добавляемые классы не поддерживаются JAXBContext. Я реализовал обход, проверив все классы в списке и создав новый JAXBContext каждый раз, когда сообщается о новых классах на основе этого списка, но это решение не очень приятно.Динамическое добавление типов в контекст jaxb

Есть ли лучший способ сделать это?

ответ

3

Вы определенно не можете динамически добавлять классы в JAXBContext. Это связано с сохранением безопасности потоков JAXBContext.

Я недавно опубликовал пример на my blog объяснить, как использовать @XmlAnyElement аннотацию, чтобы создать общее сообщение, что может иметь различные полезные нагрузки:

Корневой объект

Корневой элемент для свойства body будет управляться этими объектами @XmlRootElement.

package message; 

import javax.xml.bind.annotation.*; 

@[email protected](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 нравится (эта строка может быть передана в как переменная):

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

 Смежные вопросы

  • Нет связанных вопросов^_^