2011-06-06 2 views
3

j'ai une classe simple qui contient une hashmap:JAXB namespaces pour les propriétés java.util.Map

@XmlRootElement() 
public class Customer { 

    private long id; 
    private String name; 

    private Map<String, String> attributes; 

    public Map<String, String> getAttributes() { 
     return attributes; 
    } 

    public void setAttributes(Map<String, String> attributes) { 
     this.attributes = attributes; 
    } 

    @XmlAttribute 
    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = 
      JAXBContext.newInstance("com.rbccm.dbos.payments.dao.test"); 

     Customer customer = new Customer(); 
     customer.setId(123); 
     customer.setName("Jane Doe"); 

     HashMap<String, String> attributes = new HashMap<String, String>(); 
     attributes.put("a1", "v1"); 
     customer.setAttributes(attributes); 


     StringWriter sw = new StringWriter(); 
     Marshaller m = jc.createMarshaller(); 
     m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     m.marshal(customer, sw); 
     System.out.println(sw.toString()); 

    } 

} 

La principale méthode produit le code XML suivant:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns2:customer id="123" xmlns:ns2="http://www.example.org/package"> 
    <ns2:attributes> 
     <entry> 
      <key>a1</key> 
      <value>v1</value> 
     </entry> 
    </ns2:attributes> 
    <ns2:name>Jane Doe</ns2:name> 
</ns2:customer> 

Le problème est que je l'espace de noms est supprimé lors de la sortie du hashmap. Ce que je voudrais générer est xml comme ceci:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns2:customer id="123" xmlns:ns2="http://www.example.org/package"> 
    <ns2:attributes> 
     <ns2:entry> 
      <ns2:key>a1</ns2:key> 
      <ns2:value>v1</ns2:value> 
     </ns2:entry> 
    </ns2:attributes> 
    <ns2:name>Jane Doe</ns2:name> 
</ns2:customer> 

Répondre

0

Vous pouvez utiliser un XmlAdapter avec vous java.util.Map propriété pour obtenir la qualification d'espace de noms que vous recherchez.

Pour un exemple d'utilisation XmlAdapter avec java.uti.Map voir:

Pour plus d'informations sur JAXB et espaces de noms:


Pour votre information

J'envisage d'ajouter une extension à EclipseLink JAXB (MOXy) pour mieux gérer ce scénario:

@XmlMap(wrapper="my-entry", key="@my-key", value="my-value") 
public Map<String, PhoneNumber> phoneNumbers = new HashMap<String, PhoneNumber>(); 

L'annotation ci-dessus correspondrait au code XML suivant:

<phoneNumbers> 
    <my-entry my-key="work"> 
     <my-value>613-555-1111</value> 
    </my-entry> 
</phoneNumbers> 

Les propriétés clé/valeur seraient des instructions XPath, et les informations d'espace de noms suivraient est fait pour d'autres extensions Moxy (pour un exemple voir le lien ci-dessous):

Amélioration Demande

+0

Oui, cela fonctionne. Mais il semble que vous deviez créer 3 classes supplémentaires pour chaque type que vous souhaitez utiliser comme valeur dans le hashmap. Avec ce genre de frais généraux, il est probablement préférable de ne pas utiliser d'espace de noms sur les éléments de la carte. (L'autre lien a été très utile, vous avez peut-être remarqué que ma question est basée à 99% sur cet exemple) – Heathen

+0

cette extension semble très utile. La tâche schemagen fonctionnerait-elle aussi avec? – Heathen

+0

@Heathen - Lorsque nous l'ajoutons, cela fonctionnera certainement avec la méthode 'JAXBContext.genertateSchema()' (http://wiki.eclipse.org/EclipseLink/Examples/MOXy/JAXB/GenerateSchema). Nous avons une autre requête d'amélioration pour ajouter une tâche ant pour la génération de schéma (https://bugs.eclipse.org/336076). –

Questions connexes