JAXB (Java Architecture for XML Binding) es una API de Java que permite convertir (mapear) objetos Java en documentos XML y viceversa, de manera sencilla y eficiente. Utiliza anotaciones para definir cómo se deben representar las clases y sus propiedades en un documento XML.
En este artículo, aprenderás a usar JAXB para:
- Convertir objetos Java a XML (marshalling).
- Leer un documento XML y convertirlo en objetos Java (unmarshalling).
¿Qué es JAXB?
JAXB permite trabajar con documentos XML utilizando clases Java, lo que simplifica el manejo de datos estructurados. A través de anotaciones, puedes definir la estructura del XML directamente en tus clases.
Configuración de JAXB
Para usar JAXB, necesitas incluir las dependencias adecuadas. Si utilizas Maven, añade lo siguiente a tu archivo pom.xml
:
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>
Paso 1: Definir la Clase Java (JavaBean)
Usa anotaciones de JAXB para definir cómo mapear la clase y sus propiedades al XML.
Ejemplo: Clase Libro
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "libro")
public class Libro {
private String titulo;
private String autor;
private double precio;
// Constructor sin argumentos (requerido por JAXB)
public Libro() {}
public Libro(String titulo, String autor, double precio) {
this.titulo = titulo;
this.autor = autor;
this.precio = precio;
}
@XmlElement(name = "titulo")
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
@XmlElement(name = "autor")
public String getAutor() {
return autor;
}
public void setAutor(String autor) {
this.autor = autor;
}
@XmlElement(name = "precio")
public double getPrecio() {
return precio;
}
public void setPrecio(double precio) {
this.precio = precio;
}
}
Explicación de las Anotaciones:
@XmlRootElement
: Define el elemento raíz del XML.@XmlElement
: Especifica el nombre de las etiquetas para las propiedades.
Paso 2: Convertir un Objeto Java a XML (Marshalling)
El proceso de marshalling convierte un objeto Java en un documento XML.
Código:
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Marshaller;
import java.io.File;
public class MarshallingExample {
public static void main(String[] args) {
try {
// Crear un objeto Libro
Libro libro = new Libro("Java Básico", "Juan Pérez", 19.99);
// Crear el contexto JAXB
JAXBContext context = JAXBContext.newInstance(Libro.class);
// Crear el Marshaller
Marshaller marshaller = context.createMarshaller();
// Formatear el XML para que sea legible
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// Convertir el objeto a XML y guardarlo en un archivo
marshaller.marshal(libro, new File("libro.xml"));
// También se puede imprimir directamente en la consola
marshaller.marshal(libro, System.out);
System.out.println("XML generado con éxito.");
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
Salida (libro.xml
):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<libro>
<titulo>Java Básico</titulo>
<autor>Juan Pérez</autor>
<precio>19.99</precio>
</libro>
Paso 3: Convertir un XML a Objeto Java (Unmarshalling)
El proceso de unmarshalling convierte un documento XML en un objeto Java.
Código:
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Unmarshaller;
import java.io.File;
public class UnmarshallingExample {
public static void main(String[] args) {
try {
// Crear el contexto JAXB
JAXBContext context = JAXBContext.newInstance(Libro.class);
// Crear el Unmarshaller
Unmarshaller unmarshaller = context.createUnmarshaller();
// Leer el archivo XML y convertirlo a un objeto
Libro libro = (Libro) unmarshaller.unmarshal(new File("libro.xml"));
// Mostrar los datos del objeto
System.out.println("Título: " + libro.getTitulo());
System.out.println("Autor: " + libro.getAutor());
System.out.println("Precio: " + libro.getPrecio());
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
Salida:
Título: Java Básico
Autor: Juan Pérez
Precio: 19.99
Paso 4: Trabajar con Listas de Objetos
Si necesitas mapear una colección de objetos, define una clase contenedora.
Clase Contenedora: ListaLibros
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlRootElement(name = "libros")
public class ListaLibros {
private List<Libro> libros;
public ListaLibros() {}
public ListaLibros(List<Libro> libros) {
this.libros = libros;
}
@XmlElement(name = "libro")
public List<Libro> getLibros() {
return libros;
}
public void setLibros(List<Libro> libros) {
this.libros = libros;
}
}
Marshalling y Unmarshalling de una Lista
- Marshalling:
Crea una lista de objetosLibro
, asígnala a una instancia deListaLibros
y mapea todo a XML. - Unmarshalling:
Mapea el XML de la colección a un objetoListaLibros
.
Consejos para Trabajar con JAXB
- Constructor sin Argumentos:
Las clases deben tener un constructor público sin argumentos. - Compatibilidad con Listas:
Usa listas genéricas (List<T>
) para mapear colecciones de objetos. - Formateo del XML:
Usamarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true)
para generar XML legible. - Control de Nombres:
Personaliza los nombres de las etiquetas con@XmlElement
y@XmlRootElement
. - Excluir Propiedades:
Usa@XmlTransient
para excluir propiedades del XML.
Conclusión
JAXB simplifica enormemente el mapeo entre objetos Java y documentos XML, permitiendo integrar aplicaciones con datos estructurados de manera eficiente. Con la guía y los ejemplos proporcionados, podrás empezar a usar JAXB en tus proyectos para manejar XML de manera profesional. ¡Ponte manos a la obra!