2010-09-02 6 views
2

J'ai plusieurs plug-ins dans mon projet basé sur RCP. Je veux être en mesure de définir @XMLElements dans un plug-in qui peut ensuite être marshaled/un-marshaled à partir du plugin de base. Pour ce faire, je signale les classes qui sont sérialisables dès que le plug-in est chargé. Cependant, l'ajout dynamique de classes ne semble pas être pris en charge par JAXBContext. J'ai mis en place un work-around en maintenant toutes les classes dans une liste et en créant un nouveau JAXBContext chaque fois que de nouvelles classes sont rapportées en fonction de cette liste, mais cette solution n'est pas vraiment sympa.Ajout dynamique de types à un contexte jaxb

Y a-t-il une meilleure façon de faire cela?

Répondre

3

Vous ne pouvez certainement pas ajouter des classes dynamiquement à un JAXBContext. Cela a à voir avec le maintien de la sécurité des threads de JAXBContext.

J'ai récemment posté un exemple sur my blog expliquant comment tirer parti de l'annotation @XmlAnyElement pour générer un message générique qui pourrait avoir des charges utiles:

objet racine

L'élément racine de la propriété body sera contrôlé par les objets @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; 
} 

Création du JAXBContext

Au lieu de créer JAXBContext sur un tableau de classes, la JAXBContext pourrait être créé sur un chemin de contexte:

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

Ce chemin de contexte comprend 3 paquet noms séparés par le caractère ':'. Dans chacun de ces paquets, nous devons inclure un fichier nommé jaxb.index avec une liste de fichiers. Voici un exemple du fichier jaxb.index dans le package client:

Address 
Customer 

Lorsque nous voulons ajouter un modèle pour représenter l'ordre de notre cadre, nous étendrons notre création de JAXBContext à aimer (ce chaîne pourrait être adoptée en en tant que variable):

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