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