Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Débat : Avantages et inconvénients de JAXB pour la persistance de XML en Java

Le , par eclesia

0PARTAGES

1  0 
Bonsoir,

Je me pose beaucoup cette question depuis que j'ai eu a utiliser cette technologie pour "marshaller" et "unmarshaller" des objets sous differentes version xml.

JaxB a des avantages :
- lire et ecrire dans une vaste gamme de type d'entrée/sortie (Fichier, Flux, Noeud Dom ...etc...)
- Facilité d'utilisation.

Mais elle aussi de nombreux defauts :
- Utilisation d'annotations, ce qui oblige a alterer les classes d'origines (autrement dit impossible de l'utiliser sur une bibliotheque tierce)
- Reformatage des classes pour avoir soit des methodes get/set annotés ou des variables annotées

Et voici une liste de problemes auxquels je me suis confronté et n'ai pas pu trouver de reponses (meme en allant sur la mailing list officielle)


en version 1.0
@XmlElement(name="AnchorPoint", namespace="http://org.opengis/sld"
Resultat : <sld:AnchorPoint></sld:AnchorPoint>

en version 1.1
@XmlElement(name="AnchorPoint", namespace="http://org.opengis/se"
Resultat : <se:AnchorPoint></se:AnchorPoint>
JaxB ne permet pas d'avoir des classes annotés pour plus versions, plusieurs normes XML ou differents namespace. (exemple issu des normes OGC Styled Layer Descriptor version 1.0 et 1.1)


<Width>456</Width>
Un @XmlValue
OU
<Width><Literal>456</Literal></Width>
Des @XmlElement
Jaxb ne permet pas d'avoir des tags avec soit une valeur text soit des sous tags


Pas de mapping differencier.
Ce que j'entend par la c'est qu'il est impossible de faire en sorte d'avoir un objet se differencier en 2 ou N tag differents selon ses parametres.


Inefficace avec les interfaces.
Si on travail avec des interfaces, ce qui est une pratique souvent recommandé, il faut annoter toutes les implémentations qui existe.

Voila donc mon resenti vis a vis de cette technologie.
JaxB n'est utilisable que pour des mapping 1 pour 1 (ou presque), avec des variables de type primitif ou peu evoluer et pour une version unique d'une norme xml. Autrement dit il est inutilisable dans le cadre de projet voué a évoluer (changement des versions et normes xml impossible) et il est invasif dans le code source (annotations, refonte des classes avec des constructeurs sans arguments et autres ...)

En temps normal je ne dirais rien d'une api avec beaucoup de défaut, mais le fait qu'elle soit incluse dans la JRE me choque enormement. Elle aurait du exister en tant que librairie tierce mais pas etre imposer.

Qu'en pensez vous ?

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de Shivan
Membre confirmé https://www.developpez.com
Le 20/10/2008 à 16:12
Personnelement j'utilise jaxb pour sa facilité et le gain en vitesse de développement. Je ne passe pas par les annotations. je créer un fichier XSD et à partir de ce fichier jaxb me génère les classes utiles.

Le plus gros problème que j'ai rencontré et de devoir instancié tout mon xml en mémoire avant de le marshaller. Mais devoir coder le parseur / formateur xml "à la main" serait vraiment une perte de temps. Donc je suis très mitigé.
0  0 
Avatar de el muchacho
Membre régulier https://www.developpez.com
Le 06/12/2008 à 17:18
Citation Envoyé par Shivan Voir le message
Personnelement j'utilise jaxb pour sa facilité et le gain en vitesse de développement. Je ne passe pas par les annotations. je créer un fichier XSD et à partir de ce fichier jaxb me génère les classes utiles.

Le plus gros problème que j'ai rencontré et de devoir instancié tout mon xml en mémoire avant de le marshaller. Mais devoir coder le parseur / formateur xml "à la main" serait vraiment une perte de temps. Donc je suis très mitigé.
M'ouais, on peut faire la même chose avec Axis2 et XFire, si je ne m'abuse.
0  0 
Avatar de Ricky81
Expert éminent sénior https://www.developpez.com
Le 12/12/2008 à 21:26
Citation Envoyé par el muchacho Voir le message
M'ouais, on peut faire la même chose avec Axis2 et XFire, si je ne m'abuse.
Sauf que le rôle d'Axis2 et XFire/CXF n'est pas de faire du DataBinding. En particulier XFire/CXF peut utiliser JAXB comme implémentation du DataBinding.
0  0 
Avatar de Patriarch24
Membre expérimenté https://www.developpez.com
Le 15/12/2008 à 15:36
Personnellement, j'ai essayé XStream, Castor et JAXB, et je préfère XStream. Couplé à Spring, on ne voit pas trop la différence, c'est philosophique.
Je n'aime pas trop l'approche de JAXB, mais c'est un avis personnel. C'est pour ça que j'ai répondu : j'attends de voir comment ça évolue.
0  0 
Avatar de hugo123
Rédacteur https://www.developpez.com
Le 20/01/2009 à 20:11
Sur un projet nous avons essayé castor et jaxb. Nous avons eu des soucis avec castor dont la validation était moins stricte que jaxb et dont l'API nous a déplu.
Pour notre cas d'utilisation jaxb s'est avéré très pratique à utiliser.

Pour détailler l'utilisation que nous en faisons :

* comme Shivan plus haut nous utilisons jaxb pour générer des classes à partir d'un xsd, ce qui du coup n'est pas génant pour la partie annotation car il s'agit de code généré.
* nous utilisons aussi jaxb pour générer des facades webservices au démarrage de l'application :

- une xsd avec des annotations jaxb définit le type d'objet à traiter
(les annotations jaxb dans la xsd ne sont dispos qu'a partir de la 2.1 si je ne me trompe pas)
- jaxb est utilisé pour créer des classes. Un plugin jaxb xjc utilise les annotations pour ajouter du comportement au classe généré (ajout d'interfaces et une méthode toJson par exemple)
- les classes sont compilées et montées dans le classloader courant
- un service générique expose ses méthodes qui sont entièrement définies par la xsd grace a xfire. La xsd est exposé dans le wsdl.

Bref, sans jaxb et les annotations, tout ceci aurait été impossible.

Edit : j'ai voté "Oui mais elle ne devrait pas etre incluse dans la JRE"
déjà parce que jaxb est inclus en version 2.0 dans la JRE 1.6 et que j'ai besoin de la 2.1. De facon générale je préfère quand les implémentations sont à part dans ce type de cas.
0  0 
Avatar de sancelot
Membre à l'essai https://www.developpez.com
Le 22/01/2009 à 9:01
bonjour,
je suis en veille sur le sujet depuis quelques semaines, apres avoir essayé de mettre en oeuvre castor sous linux, on se rend compte que c'est une galère .
ceci ne semble pas etre le cas avec jaxb

mon sujet de recherche est le suivant :
j'utilise un xsd pour génerer les classes permettant de manipuler ces données , principalement avec une interface graphique JTable, avec des fonctions de persistance/marshall/unmarshall.

Cordialement,
S.Ancelot
0  0 
Avatar de oneLng
Futur Membre du Club https://www.developpez.com
Le 29/01/2009 à 9:30
salut,

Nous utisons JAXB en production depuis +sieurs mois. C'est simple et ça fonctionne parfaitement. Nous sommes partis d'un XSD pour générer les classes java manipulant les messages XML. Ladite génération des classes s'est faite en ligne de commande avec XJC. Petite question : serait-ce possible d'effectuer la génération et utiliser les classes générées dans la même exécution du programme ?

Merci.
0  0 
Avatar de moutonbreton
Candidat au Club https://www.developpez.com
Le 29/01/2009 à 9:36
Il y a quelques mois j'ai eu l'occasion de tester quelques produits cités ici. Je précise que je recherchais avant tout un outils de permettant de générer du code Java à partir d'un schéma XML.

JAXB : très bon support XML Schema dans les dernières versions. La possibilité offerte de contrôler la génération des classes par l'intermédiaire d'annotations dans le schéma XML est des plus intéressante.

Castor : support insuffisant du XML Schema (pas de support du type xs:anyType par exemple).

XMLBeans : je m'étonne que personne ne l'ai encore cité. De ce que j'ai pu voir, l'outil qui offre le meilleur support XML Schema. J'ai beaucoup apprécié également la possibilité de "naviguer" dans mes objets avec des requêtes XPATH ou XQuery. L'outils atteint ses limites lorsqu'il s'agit d'unmarshaller un XML volumineux. Mais effectuer un pré-traitement StAX sur le XML pour unmarshaller morceau par morceau permet de contourner se problème.

XStream : l'outils le plus simple d'utilisation mais pas vraiment un outils de databinding XML à mon sens. Il n'offre pas la possibilité de générer des classes depuis un schéma XML. Le contrôle sur le XML généré à partir d'objet Java est assez limité. Je le qualifierais ainsi plutôt d'outils de sérialisation/désérialisation.
0  0 
Avatar de moutonbreton
Candidat au Club https://www.developpez.com
Le 29/01/2009 à 9:42
Citation Envoyé par oneLng Voir le message
Petite question : serait-ce possible d'effectuer la génération et utiliser les classes générées dans la même exécution du programme ?
C'est sûrement possible. C'est ce que fait je pense GroovyWS :

http://groovy.codehaus.org/GroovyWS
0  0 
Avatar de hugo123
Rédacteur https://www.developpez.com
Le 29/01/2009 à 10:03
Citation Envoyé par oneLng Voir le message

Petite question : serait-ce possible d'effectuer la génération et utiliser les classes générées dans la même exécution du programme ?
Je confirme la réponse plus haut, c'est justement ce que nous faisons dans notre application. Des Xsd sont lus au démarrage, nous générons des classes dans un répertoire puis les compilons et les importons dans le classloader courant.
0  0