Динамическое добавление типов в контекст jaxb - PullRequest
3 голосов
/ 02 сентября 2010

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

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

1 Ответ

3 голосов
/ 02 сентября 2010

Вы определенно не можете динамически добавлять классы в 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 со списком файлов.Ниже приведен пример файла jaxb.index в клиентском пакете:

Address
Customer 

Когда мы хотим добавить модель для представления заказов в нашей структуре, мы расширили бы создание нашего JAXBContext до (эта строка может бытьпередается как переменная):

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