JAXB Namespace


Personnaliser le préfix du namespace dans un fichier xml avec JAXB.

JAXB est l’architecture Java permettant de transformer un Objet Java en fichier ou un fichier xml en Objet Java.

Dans ce tutoriel, nous allons voir les choses suivantes :

  • Transformation d’un objet java en flux xml
  • Personnalisation du préfix du namespace (qui est le sujet tu tutoriel)

Technologies utilisées dans cet article

  • JDK 1.8
  • JAXB 2.2.2

  • Dépendances Maven

Pour JAXB, pas besoin de dépendance, la JDK contient tout le nécessaire dans le fichier « rt.jar » ; il nous faut donc qu’une dépendance à ajouter dans le « pom.xml »

<dependency>        <groupId>com.sun.xml.bind</groupId>        <artifactId>jaxb-impl</artifactId>        <version>2.2.2</version></dependency>
  • Création de l’Objet à transformer en Xml.

Nous devons utiliser les annotations JAXB pour la création de l’Objet sans oublier de préciser le namespace.

package com.prefix.exemple;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement(namespace = "urn:test:namespace:persone")public class Personne {   private String nom;   private String prenom;   private String age;   /**     * @return the nom.     */   public String getNom() {       return nom;   }   /**     * @param nom nom to set.     */   @XmlElement   public void setNom(String nom) {       this.nom = nom;   }   /**     * @return the prenom.     */   public String getPrenom() {       return prenom;   }   /**     * @param prenom prenom to set.     */   @XmlElement   public void setPrenom(String prenom) {       this.prenom = prenom;   }   /**     * @return the age.     */   public String getAge() {       return age;   }   /**     * @param age age to set.     */   @XmlElement   public void setAge(String age) {       this.age = age;   }}

 

  • Transformer notre objet en xml (avec le préfix par defaut)
package com.prefix.exemple; import javax.xml.bind.JAXBContext;import javax.xml.bind.JAXBException;import javax.xml.bind.Marshaller;public class Main {   /**     * @param args     * @throws JAXBException     */   public static void main(String[] args) throws JAXBException {       Personne p = new Personne();       p.setNom("Nom");       p.setPrenom("Prenom");       p.setAge("31");       JAXBContext jaxbContext = JAXBContext.newInstance(Personne.class);       Marshaller jaxbMarshaller = jaxbContext.createMarshaller();       jaxbMarshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");       jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);       jaxbMarshaller.marshal(p, System.out);   }}
  • Sortie Standard (le préfix du namespace « urn:test:namespace:persone » est « ns2 »)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><ns2:personne xmlns:ns2="urn:test:namespace:persone">    <age>31</age>    <nom>Nom</nom>    <prenom>Prenom</prenom></ns2:personne>
  • Personnalisation du préfix

Pour la gestion du préfix des namespaces, JAXB utilise l’Objet « com.sun.xml.bind.marshaller.NamespacePrefixMapper » nous allons surcharger cet Objet pour la personnalisation ce préfix en remplacer le préfix par défaut « ns2 » par « test » comme suit :

  • Surcharge et réécriture de l’Objet
package com.prefix.exemple;import com.sun.xml.bind.marshaller.NamespacePrefixMapper;public class MyNamespaceMapper extends NamespacePrefixMapper {   private static final String PREFIX = "test";   private static final String URI = "urn:test:namespace:persone";   @Override   public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {       if (URI.equals(namespaceUri)) {           return PREFIX;       }       return suggestion;   }    @Override   public String[] getPreDeclaredNamespaceUris() {       return new String[] { URI };   }}
  • Prise en compte du changement de préfix

 

package com.prefix.exemple; import javax.xml.bind.JAXBContext;import javax.xml.bind.JAXBException;import javax.xml.bind.Marshaller;public class Main {    /**     * @param args     * @throws JAXBException     */   public static void main(String[] args) throws JAXBException {             Personne p = new Personne();       p.setNom("Nom");       p.setPrenom("Prenom");       p.setAge("31");       JAXBContext jaxbContext = JAXBContext.newInstance(Personne.class);       Marshaller jaxbMarshaller = jaxbContext.createMarshaller();       jaxbMarshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");       jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);       jaxbMarshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new MyNamespaceMapper());       jaxbMarshaller.marshal(p, System.out);   }}
  • Sortie Standard (le préfix du namespace « urn:test:namespace:persone » est « test »)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><test:personne xmlns:test="urn:test:namespace:persone">    <age>31</age>    <nom>Nom</nom>    <prenom>Prenom</prenom></test:personne>