Hello,
J'utilise JAXB (inclut dans Java6 en version 2.1 maintenant contrairement à ce qui a été dit ci-dessus).
1 2 3 4 5 6 7 8
| $ xjc -version
xjc version "JAXB 2.1.3 in JDK 1.6"
JavaTM Architecture for XML Binding(JAXB) Reference Implementation, (build JAXB 2.1.3 in JDK 1.6)
$ java -version
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode, sharing) |
Ceci dans le cadre d'un projet de synchronisation entre l'application et des serveurs fédéraux ou cantonaux (je suis en Suisse). Nous développons la partie client.
Il a énormément de xsd qui sont fourni dans la norme à implémenter et je ne me voyais absolument pas me taper le binding à la main. Ayant déjà utilisé JAXB dans le cadre d'utilisation d'un webservice, je l'ai également utilisé ici.
Le code généré est propre, facile à faire avec xjc, bien documenté (javadoc détaillant le schema). Faut juste se faire aux maxoccurs="unbounded" qui fait un code comme ça :
obj.getList().add(monObj)
Il faut bien sûr coder ce qu'il faut pour faire correspondre nos objets métiers aux objets utilisés dans le XML (des bêtes set(get())) mais avec la volumétrie, c'est du boulot.
Et quand les XSD changent de version, il faut regénérer le code et adapter. Mais bon, peu importe l'outil utilisé, quand les XSD changent, il y a toujours du code à adapter... Personnellement je préfère regénérer le code, voir les erreurs de compi dans Eclipse, et corriger, c'est assez facile.
Marshaller/unmarshaller est super facile.
Un défaut, la classe com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper qui est dans le package com.sun ... pas top top pour l'utiliser proprement.
On peut personnaliser le prefix comme on le souhaite en fournissant une instance du NamespacePrefixMapper.
On peut placer les XSD où on veut sans avoir besoin de les modifier en utilisant org.w3c.dom.ls.LSResourceResolver (modifie l'emplacement du xsd).
La validation est facile à mettre en oeuvre.
Personnellement j'aime bien le principe d'avoir un code java pour mes XML totalement séparé de mon code métier, quitte à développer ce qu'il faut pour passer de l'un à l'autre. Annoter des classes existantes je trouve mal pratique, surtout que différentes classes pourraient être utilisées pour différents XML, ce qui deviendra impossible à maintenir efficacement.
L'idéal est effectivement d'avoir les XSD ou les faire, puis de générer le code.
Avis positif sur JAXB, et je trouve positif également que ça doit dans le JRE (car permet de l'avoir directement dans le JDK) et que c'est un outil efficace et simple pour l'utilisation de gros schema XSD.
Je sais également que le fournisseur de la version serveur de la norme que nous mettons en place utilise également JAXB 2.1 (Java5 par contre).
Partager