¿Qué es JAXB y por qué debería usarlo? [cerrado]

109

Hay un tipo aquí jurando que JAXB es lo mejor desde el pan de molde. Tengo curiosidad por ver qué piensan los usuarios de Stack Overflow que es el caso de uso de JAXB y qué lo convierte en una buena o mala solución para ese caso.

Jay R.
fuente
2
Lea este artículo (Arquitectura Java para enlaces XML (JAXB)) este es el mejor. URL: oracle.com/technetwork/articles/javase/index-140168.html#unmars

Respuestas:

99

Soy un gran fan de JAXB para manipular XML. Básicamente, proporciona una solución a este problema (supongo que está familiarizado con XML, estructuras de datos Java y esquemas XML):

Trabajar con XML es difícil. Se necesita una forma de tomar un archivo XML, que es básicamente un archivo de texto, y convertirlo en algún tipo de estructura de datos, que luego su programa puede manipular.

JAXB tomará un esquema XML que usted escriba y creará un conjunto de clases que correspondan a ese esquema. Las utilidades JAXB crearán la jerarquía de estructuras de datos para manipular ese XML.

Luego, JAXB se puede usar para leer un archivo XML y luego crear instancias de las clases generadas, cargadas con los datos de su XML. JAXB también hace lo contrario: toma clases de Java y genera el XML correspondiente.

Me gusta JAXB porque es fácil de usar y viene con Java 1.6 (si está usando 1.5, puede descargar JAXB .jars.) La forma en que crea la jerarquía de clases es intuitiva y, en mi experiencia, hace un trabajo decente. abstraer el "XML" para poder concentrarme en los "datos".

Entonces, para responder a su pregunta: esperaría que, para archivos XML pequeños, JAXB sea excesivo. Requiere que cree y mantenga un esquema XML y que utilice "métodos de libro de texto estándar" para utilizar clases Java para estructuras de datos. (Clases principales, pequeñas clases internas para representar "nodos" y una enorme jerarquía de ellos). Por lo tanto, JAXB probablemente no sea tan bueno para una simple lista lineal de "preferencias" para una aplicación.

Pero si tiene un esquema XML bastante complejo y muchos datos contenidos en él, entonces JAXB es fantástico. En mi proyecto, convertía grandes cantidades de datos entre binarios (que eran consumidos por un programa en C) y XML (para que los humanos pudieran consumir y modificar esos datos). El esquema XML resultante no fue trivial (muchos niveles de jerarquía, algunos campos podrían repetirse, otros no), por lo que JAXB fue útil para poder manipular eso.

poundifdef
fuente
21
JAXB se puede realizar sin XSD. Puede usar anotaciones: jaxb.dev.java.net/guide/Mapping_your_favorite_class.html
codefinger
7
JAXB es una especificación (como JPA o JAXP), lo que significa que hay múltiples implementaciones (Metro, EclipseLink, etc.). Si tiene algún problema con una, puede cambiar a otra implementación. También puede aprovechar las extensiones ofrecidas por diferentes proveedores.
bdoughan
@BlaiseDoughan, ¿Metro es una implementación JAXB? ¿No es Metro una implementación de WSIT?
Muhammad Gelbana
1
@MuhammadGelbana - Supongo que debería referirme a él como Proyecto JAXB ( jaxb.java.net ), que es parte de la implementación de Metro, JAX-WS ( metro.java.net ).
bdoughan
2
Para su información, JAXB se eliminará de Java SE 11. Consulte JEP 320: Eliminar los módulos Java EE y CORBA . Esta acción se está tomando como parte de la modularización de Java SE y el traspaso de tecnologías Java EE al proyecto Jakarta EE . Deberá agregar la API JAXB y una implementación a su proyecto.
Basil Bourque
23

Aquí hay una razón para no usarlo: el rendimiento se ve afectado. Hay una gran cantidad de gastos generales al ordenar y descalificar. Es posible que también desee considerar otra API para el enlace de objetos XML, como JiBX: http://jibx.sourceforge.net/

codefinger
fuente
1
También considere usar la herramienta XSD2Jibx si tiene problemas con los enlaces; está en estado "alfa", pero es realmente útil ilustrar las clases y enlaces que le gustan con esquemas XSD ... ahora, si solo dejara de usar la fecha SQL de forma predeterminada , y usó Java util Date en su lugar ...
MetroidFan2002
3
Mierda. JAXB es bastante rápido, siempre que use un analizador rápido (como Woodstox), una sobrecarga de tal vez un 30-40% en comparación con el enlace manual. JiBX está bien, no hay problema con él, pero la diferencia de rendimiento no es enorme.
StaxMan
6
He usado JAXB en varios proyectos y continúo usándolo. Pero es importante comprender cómo se compara con otros marcos. Si está ordenando / deshaciendo documentos que tienen cientos de megabytes y el tiempo es importante, JiBX es una buena alternativa. JAXB == reflexión, JiBX == instrumentación de código de bytes.
codefinger
19

Es un "ORM para XML". Se utiliza con mayor frecuencia junto con JAX-WS (y de hecho las implementaciones de Sun se desarrollan juntas) para los sistemas WS Death Star.

Tom Hawtin - tackline
fuente
19

Uso JAXB en el trabajo todo el tiempo y realmente me encanta. Es perfecto para esquemas XML complejos que siempre están cambiando y es especialmente bueno para el acceso aleatorio de etiquetas en un archivo XML.

Odio ser chulo, pero acabo de comenzar un blog y esto es literalmente lo primero que publiqué

Compruébalo aquí:

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

artgon
fuente
4
Claro ejemplo en tu blog. Voto a favor por eso. :-)
Shawn D.
9

Con JAXB puede crear automáticamente representaciones XML de sus objetos (ordenación) y representaciones de objetos del XML (desagrupación).

En lo que respecta al esquema XML, tiene dos opciones:

  • Generar clases de Java desde un XSD
  • Genere un XSD a partir de sus clases de Java

También hay algunas bibliotecas de serialización XML simples como xstream , digestor o XMLBeans que podrían ser alternativas.

Fabian Steeg
fuente
1
Estos no son marcos vinculantes, son bibliotecas de serialización. Un buen marco de enlace puede mapear cualquier XML a un gráfico de objeto isomorfo o viceversa. Estos simples mecanismos de serialización producen y consumen un esquema XML fijo y no estándar.
erickson
Gracias Erickson, solo he trabajado con JAXB y quería asegurarme de mencionar alternativas. Editaré mi respuesta en función de su entrada.
Fabian Steeg
En realidad, aunque XStream está bien, no es realmente más simple, ya que ambos son muy simples. Y Digester NO es simple, solo simplista.
StaxMan
2
Alguien mencione JAXB-2.0 usando Anotaciones. Entre eso y algunas clases de XmlAdapter, puedo asignar cualquier esquema a cualquier estructura Java existente.
Mark Renouf
8

JAXB es excelente si tiene que codificar en alguna especificación XML externa definida como un esquema XML ( xsd).

Por ejemplo, tiene una aplicación comercial y debe informar las operaciones a la aplicación Uber Lame Trade Reporting y le han dado ultra.xsdpara seguir adelante. Utilice el $JAVA_HOME/bin/xjccompilador para convertir el XML en un montón de clases de Java (por ejemplo UltraTrade).

Luego, puede simplemente escribir una capa de adaptador simple para convertir sus objetos comerciales UltraTradesy usarlos JAXBpara ordenar los datos a Ultra-Corp. Mucho más fácil que jugar a convertir sus operaciones a su formato XML.

Donde todo se rompe es cuando Ultra-Corp en realidad no ha obedecido su propia especificación, y el intercambio priceque tienen como un en xsd:floatrealidad debería expresarse como un double!

oxbow_lakes
fuente
1
También tenga en cuenta que PUEDE hacer código primero: comience con beans, genere el esquema si lo necesita.
StaxMan
7

¿Por qué necesitamos JAXB? Los componentes remotos (escritos en Java) de los servicios web utilizan XML como medio para intercambiar mensajes entre ellos. ¿Por qué XML? Porque XML se considera una opción liviana para intercambiar mensajes en redes con recursos limitados. Muy a menudo necesitamos convertir estos documentos XML en objetos y viceversa. Por ejemplo: Simple Java POJO Employee se puede utilizar para enviar datos de empleados a un componente remoto (también un programa Java).

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

Este Pojo debe convertirse (Marshall) en un documento XML de la siguiente manera:

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

Y en el componente remoto, de vuelta al objeto Java desde el documento XML (Un-Marshall).

¿Qué es JAXB?

JAXB es una biblioteca o herramienta para realizar esta operación de Marshalling y UnMarshalling. Te ahorra este dolor de cabeza, tan simple como eso.

Prashant_M
fuente
4

También puede consultar JIBX. También es una carpeta de datos xml muy buena, que también está especializada en OTA (Open Travel Alliance) y es compatible con servidores AXIS2. Si busca rendimiento y compatibilidad, puede comprobarlo:

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

LostMohican
fuente
0

JAXB proporciona un rendimiento mejorado a través de optimizaciones de clasificación predeterminadas. JAXB define una API de programador para leer y escribir objetos Java desde y hacia documentos XML, simplificando así la lectura y escritura de XML a través de Java.


fuente