Qu'est-ce que JAXB et pourquoi devrais-je l'utiliser? [fermé]

109

Il y a des gars ici qui jurent que JAXB est la meilleure chose depuis le pain tranché. Je suis curieux de voir ce que les utilisateurs de Stack Overflow pensent que le cas d'utilisation est pour JAXB et ce qui en fait une bonne ou une mauvaise solution pour ce cas.

Jay R.
la source
2
Lisez cet article (Java Architecture for XML Binding (JAXB)), c'est le meilleur. URL: oracle.com/technetwork/articles/javase/index-140168.html#unmars

Réponses:

99

Je suis un grand fan de JAXB pour manipuler XML. Fondamentalement, il fournit une solution à ce problème (je suppose que je suis familier avec XML, les structures de données Java et les schémas XML):

Travailler avec XML est difficile. Il faut trouver un moyen de prendre un fichier XML - qui est essentiellement un fichier texte - et de le convertir en une sorte de structure de données, que votre programme peut ensuite manipuler.

JAXB prendra un schéma XML que vous écrivez et créera un ensemble de classes correspondant à ce schéma. Les utilitaires JAXB créeront la hiérarchie des structures de données pour manipuler ce XML.

JAXB peut ensuite être utilisé pour lire un fichier XML, puis créer des instances des classes générées - chargées des données de votre XML. JAXB fait également l'inverse: prend les classes Java et génère le XML correspondant.

J'aime JAXB car il est facile à utiliser et est livré avec Java 1.6 (si vous utilisez 1.5, vous pouvez télécharger le JAXB .jars.) La façon dont il crée la hiérarchie des classes est intuitive et, d'après mon expérience, fait un travail décent abstraction du "XML" afin que je puisse me concentrer sur les "données".

Donc, pour répondre à votre question: je m'attendrais à ce que, pour les petits fichiers XML, JAXB soit excessif. Cela nécessite que vous créiez et mainteniez un schéma XML et que vous utilisiez des «méthodes de manuel standard» d'utilisation des classes Java pour les structures de données. (Classes principales, petites classes internes pour représenter les "nœuds", et une énorme hiérarchie d'entre eux.) Ainsi, JAXB n'est probablement pas si génial pour une simple liste linéaire de "préférences" pour une application.

Mais si vous avez un schéma XML plutôt complexe, et beaucoup de données qu'il contient, alors JAXB est fantastique. Dans mon projet, je convertissais de grandes quantités de données entre binaires (qui étaient consommées par un programme C) et XML (afin que les humains puissent consommer et modifier ces données). Le schéma XML résultant n'était pas trivial (plusieurs niveaux de hiérarchie, certains champs pouvaient être répétés, d'autres pas), donc JAXB était utile pour pouvoir manipuler cela.

poundifdef
la source
21
JAXB peut être fait sans XSD. Vous pouvez utiliser les annotations: jaxb.dev.java.net/guide/Mapping_your_favorite_class.html
codefinger
7
JAXB est une spécification (comme JPA ou JAXP), ce qui signifie qu'il existe plusieurs implémentations (Metro, EclipseLink, etc.). Si vous rencontrez un problème avec l'un, vous pouvez passer à une autre implémentation. Vous pouvez également profiter des extensions proposées par différents fournisseurs.
bdoughan
@BlaiseDoughan, Metro est une implémentation JAXB?! Metro n'est-il pas une implémentation WSIT?
Muhammad Gelbana
1
@MuhammadGelbana - J'imagine que j'aurais dû l'appeler Project JAXB ( jaxb.java.net ) qui fait partie de l'implémentation Metro de JAX-WS ( metro.java.net ).
bdoughan
2
Pour info, JAXB est en cours de suppression de Java SE 11. Voir JEP 320: Suppression des modules Java EE et CORBA . Cette action s'inscrit dans le cadre de la modularisation de Java SE et du transfert des technologies Java EE au projet Jakarta EE . Vous devrez ajouter l'API JAXB et une implémentation à votre projet.
Basil Bourque
23

Voici une raison pour ne pas l'utiliser: les performances en souffrent. Il y a beaucoup de frais généraux lors du marshaling et du démarshaling. Vous pouvez également envisager une autre API pour la liaison d'objets XML - telle que JiBX: http://jibx.sourceforge.net/

codefinger
la source
1
Pensez également à utiliser l'outil XSD2Jibx si vous rencontrez des problèmes avec les liaisons - il est en statut "alpha", mais il est vraiment utile d'illustrer les classes et les liaisons qu'il aime avec les schémas XSD ... maintenant, si seulement il a cessé d'utiliser la date SQL par défaut , et utilisé Java util Date à la place ...
MetroidFan2002
3
Connerie. JAXB est assez rapide, tant que vous utilisez un analyseur rapide (comme Woodstox), une surcharge de peut-être 30 à 40% par rapport à la liaison manuelle. JiBX va bien, pas de problème, mais la différence de performance n'est pas énorme.
StaxMan
6
J'ai utilisé JAXB sur plusieurs projets et je continue de l'utiliser. Mais il est important de comprendre comment il se compare à d'autres cadres. Si vous marshalez / démarquez des documents de centaines de mégaoctets et que le temps est important, JiBX est une bonne alternative. JAXB == réflexion, JiBX == instrumentation de code octet.
codefinger le
19

C'est un "ORM pour XML". Le plus souvent utilisé avec JAX-WS (et en fait les implémentations de Sun sont développées ensemble) pour les systèmes WS Death Star.

Tom Hawtin - Tacle
la source
19

J'utilise JAXB au travail tout le temps et je l'aime vraiment. Il est parfait pour les schémas XML complexes qui changent constamment et particulièrement pour l'accès aléatoire des balises dans un fichier XML.

Je déteste le proxénète mais je viens de commencer un blog et c'est littéralement la première chose que j'ai publiée!

Vérifiez le ici:

http://arthur.gonigberg.com/2010/04/21/getting-started-with-jaxb/

Artgon
la source
4
Exemple clair sur votre blog. J'ai voté pour cela. :-)
Shawn D.
9

Avec JAXB, vous pouvez créer automatiquement des représentations XML de vos objets (marshalling) et des représentations d'objets du XML (unmarshalling).

En ce qui concerne le schéma XML, vous avez deux choix:

  • Générer des classes Java à partir d'un XSD
  • Générez un XSD à partir de vos classes Java

Il existe également des bibliothèques de sérialisation XML plus simples comme XStream , Digester ou XMLBeans qui pourraient être des alternatives.

Fabian Steeg
la source
1
Ce ne sont pas des frameworks de liaison, ce sont des bibliothèques de sérialisation. Un bon cadre de liaison peut mapper n'importe quel XML à un graphe d'objets isomorphes ou inversement. Ces mécanismes de sérialisation simples produisent et utilisent un schéma XML fixe et non standard.
erickson
Merci erickson, je n'ai travaillé qu'avec JAXB et je voulais m'assurer de mentionner des alternatives. Je modifierai ma réponse en fonction de votre entrée.
Fabian Steeg
En fait, bien que XStream soit correct, ce n'est pas vraiment plus simple, car les deux sont très simples. Et Digester n'est PAS simple, simplement simpliste.
StaxMan
2
Quelqu'un veuillez mentionner JAXB-2.0 à l'aide des annotations. Entre cela et quelques classes XmlAdapter, je peux mapper n'importe quel schéma à n'importe quelle structure Java existante.
Mark Renouf
8

JAXB est idéal si vous devez coder selon une spécification XML externe définie comme un schéma XML ( xsd).

Par exemple, vous avez une application de trading et vous devez signaler les transactions à l'application Uber Lame Trade Reporting et ils vous ont donné ultra.xsdpour continuer. Utilisez le $JAVA_HOME/bin/xjccompilateur pour transformer le XML en un tas de classes Java (par exemple UltraTrade).

Ensuite, vous pouvez simplement écrire une simple couche d' adaptateur vers laquelle convertir vos objets d'échange UltraTradeset utiliser JAXBpour rassembler les données vers Ultra-Corp. Beaucoup plus facile que de déconner pour convertir vos transactions dans leur format XML.

Là où tout tombe en panne, c'est quand Ultra-Corp n'a pas réellement obéi à ses propres spécifications, et que le commerce pricequ'ils ont en tant que a xsd:floatdevrait en fait être exprimé par un double!

oxbow_lakes
la source
1
Notez également que vous POUVEZ faire du code d'abord: commencez par des beans, générez un schéma si vous en avez besoin.
StaxMan
7

Pourquoi avons-nous besoin de JAXB? Les composants distants (écrits en Java) des services Web utilisent XML comme moyen d'échanger des messages entre eux. Pourquoi XML? Parce que XML est considéré comme une option légère pour échanger des messages sur des réseaux avec des ressources limitées. Nous devons très souvent convertir ces documents XML en objets et vice versa. Par exemple: Simple Java POJO Employee peut être utilisé pour envoyer des données Employee à un composant distant (également un programme Java).

class Employee{
 String name;
 String dept;
 ....
}

Ce Pojo doit être converti (Marshall) en document XML comme suit:

<Employee>
  <Name>...</Name>
  <Department>...</Department>
</Employee>

Et au niveau du composant distant, retour à l'objet Java à partir du document XML (Un-Marshall).

Qu'est-ce que JAXB?

JAXB est une bibliothèque ou un outil pour effectuer cette opération de Marshalling et UnMarshalling. Cela vous épargne ce mal de tête, aussi simple que cela.

Prashant_M
la source
4

Vous pouvez également consulter JIBX. C'est aussi un très bon classeur de données xml, également spécialisé en OTA (Open Travel Alliance) et supporté par les serveurs AXIS2. Si vous recherchez des performances et une compatibilité, vous pouvez les vérifier:

http://jibx.sourceforge.net/index.html

PerduMohican
la source
0

JAXB offre des performances améliorées via des optimisations de marshalling par défaut. JAXB définit une API de programmation pour la lecture et l'écriture d'objets Java vers et depuis des documents XML, simplifiant ainsi la lecture et l'écriture de XML via Java.


la source