Marin, et enrichissons-le un peu.
Exemple 1. Modèle JAXB
// // énumération Grade // public enum Grade { MATELOT, BOSCO, PACHA, CUISINIER } // // Entité Marin // @XmlRootElement(name="marin", namespace="http://www.paumard.org/cours-jaxb") @XmlAccessorType(XmlAccessType.FIELD) @Entity public class Marin implements Serializable { @XmlAttribute(name="id") @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String nom ; @Enumerated(EnumType.STRING) private Grade grade ; // reste de la classe }
@XmlRootElement : indique que nos objets
Marin seront des objets racine des documents XML que nous allons générer. Le
nom passé en attribut correspond au nom de l'élément racine du document XML généré. Le
namespace est lui l'espace de noms utilisé.
@XmlAccessorType : indique que les champs de la classe
Marin seront lus directement, sans passer par les
getters
. Cette annotation peut prendre comme argument
XmlAccessType.PROPERTY si l'on veut passer par les
getters
.
@XmlAttribute : indique que ce champ doit être écrit dans un attribut plutôt qu'un sous-élément. Le nom de cet attribut est précisé en tant qu'attribut de cette annotation.
Exemple 2. Création d'un document XML par JAXB
public static void main(String[] args) throws JAXBException {
// création d'un objet de type Marin
Marin marin = new Marin() ;
marin.setId(15L) ;
marin.setNom("Surcouf") ;
marin.setGrade(Grade.PACHA) ;
// création d'un contexte JAXB sur la classe Marin
JAXBContext context = JAXBContext.newInstance(Marin.class) ;
// création d'un marshaller à partir de ce contexte
Marshaller marshaller = context.createMarshaller() ;
// on choisit UTF-8 pour encoder ce fichier
marshaller.setProperty("jaxb.encoding", "UTF-8") ;
// et l'on demande à JAXB de formatter ce fichier de façon
// à pouvoir le lire à l'oeil nu
marshaller.setProperty("jaxb.formatted.output", true) ;
// écriture finale du document XML dans un fichier surcouf.xml
marshaller.marshal(marin, new File("surcouf.xml")) ;
}
Exemple 3. Document XML généré par JAXB
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns2:marin xmlns:ns2="http://www.paumard.org/cours-jaxb" id="15"> <nom>Surcouf</nom> <grade>PACHA</grade> </ns2:marin>
marin pour élément racine, dans le bon espace de noms ;
id est bien écrit en tant qu'attribut du nœud
marin ;
nom et
grade sont écrits en tant que sous-éléments du nœud
marin.
Marin par lecture du document XML. Le code de cette lecture est symétrique du code d'écriture.
Exemple 4. Lecture d'un document XML par JAXB
public static void main(String[] args) throws JAXBException {
// création d'un contexte JAXB sur la classe Marin
JAXBContext context = JAXBContext.newInstance(Marin.class) ;
// création d'un unmarshaller
Unmarshaller unmarshaller = context.createUnmarshaller() ;
Marin surcouf = (Marin)unmarshaller.unmarshal(new File("surcouf.xml")) ;
System.out.println("Id = " + surcouf.getId()) ;
System.out.println("Nom = " + surcouf.getNom()) ;
}
@Path
@Produces et
@Consumes
@Provider
MessageBodyReader et
MessageBodyWriter