Creación de Mapeadores con MapStruct en Java
Clase 20 de 35 • Curso de Java Spring
Contenido del curso
- 10

Conceptos básicos de JPA y anotaciones en Java
03:04 - 11

Gestión de Bases de Datos con Spring Data JPA en Java
05:24 - 12

Conexión y Configuración de Base de Datos en Spring Boot
12:09 - 13

Mapeo de Tablas a Clases con JPA: Creación de Entities en Java
14:00 - 14

Creación de Entities con Clave Primaria Compuesta en JPA
06:49 - 15

Relaciones JPA: Categorías, Productos, Compras y Clientes
10:37 - 16

Repositorios de Spring Data: Gestión Eficiente de Bases de Datos
07:54 - 17

Consultas avanzadas con Query Methods en Spring Data
09:30
- 18

Clase de Repositorio de Productos con Spring Framework
05:19 - 19

Patrón DataMapper en Proyectos Java: Implementación y Beneficios
13:37 - 20

Creación de Mapeadores con MapStruct en Java
11:22 - 21

Repositorio de Productos Orientado al Dominio en Java
09:27 - 22

Inyección de Dependencias en Spring Framework
04:34 - 23

Implementación de Servicios de Dominio en Java con Spring Framework
09:12 - 24

Creación de Controlador REST en Spring Boot
07:14 - 25

Anotaciones Spring para Exponer APIs RESTful
09:25
- 26

Control de Respuestas HTTP con ResponseEntity en Spring
09:11 - 27

Modelado de Dominio para Gestión de Compras en Supermercados
05:27 - 28

Mapeadores en Java para Conversión de Compras y Productos
10:45 - 29

Implementación de Repositorio en Java para Compras en Supermercado
09:01 - 30

Pruebas de API de Compras con Postman
02:56 - 31

Documentación de APIs con Swagger en Spring Boot
12:55
¿Cómo crear un paquete y una interfaz para los mapeadores?
Al trabajar en desarrollos de software, es esencial contar con herramientas que faciliten la transformación de datos entre diferentes capas del sistema. Una de esas herramientas es MapStruct, que nos permitirá generar mapeadores para traducir objetos de dominio a entidades y viceversa. Para comenzar, debemos:
- Crear un nuevo paquete en nuestro proyecto, al cual llamaremos
Mapper. - Dentro de este paquete, necesitamos crear interfases específicas para cada mapeador:
CategoryMapperyProductMapper.
Esto se hace seleccionando "new package" y posteriormente "new interfaz" en nuestro IDE. Estos mapeadores serán fundamentales para asegurar que las conversiones se realicen de manera eficiente y precisa.
¿Qué anotaciones se deben utilizar en un mapeador?
MapStruct nos ofrece una sintaxis clara y precisa para definir nuestras conversiones:
- @Mapper: Esta anotación debe añadirse a cada interfaz para indicar que se trata de un mapeador MapStruct.
- componentModel = "spring": Se establece como parte de @Mapper, permitiendo integrar MapStruct con Spring. Indica que nuestro mapeador debe comportarse como un componente Spring.
Definir estas anotaciones garantiza que MapStruct gestione correctamente la creación de instancias de mapeadores y su integración con el ciclo de vida de Spring.
¿Cómo definir métodos de conversión?
Los métodos de conversión transforman un tipo de objeto en otro. Aquí definimos métodos para convertir Category y Product en sus equivalentes del dominio.
Conversión de Category a categoría
@Mapper(componentModel = "spring")
public interface CategoryMapper {
@Mapping(source = "idCategoria", target = "categoryId")
@Mapping(source = "descripcion", target = "category")
@Mapping(source = "estado", target = "active")
Category toCategory(Categoria categoria);
}
Aquí, @Mapping configura cómo se mapean fielmente los datos desde idCategoria, descripcion, y estado hacia sus respectivos atributos en la entidad Category.
Conversión inversa y manejo de atributos ignorados
Para realizar mapeos inversos (de Category a Categoria) y asegurarse de ignorar ciertos atributos que no son necesarios en el lado de la entidad, MapStruct permite el uso de:
- @InheritInverseConfiguration: Facilita que la conversión inversa utilice las mismas reglas ya definidas.
- Para ignorar campos específicos, utilizamos:
@Mapping(target = "productos", ignore = true)
Implementar estas configuraciones limita el código redundante y simplifica el manejo de atributos compatibles entre sistemas.
¿Cómo usar mapeadores para productos?
La interfaz ProductMapper sigue un diseño similar:
Metodología de mapeo
@Mapper(componentModel = "spring", uses = CategoryMapper.class)
public interface ProductMapper {
@Mappings({
@Mapping(source = "idProducto", target = "productId"),
@Mapping(source = "nombre", target = "name"),
@Mapping(source = "precioVenta", target = "price"),
@Mapping(source = "cantidadStock", target = "stock"),
@Mapping(source = "estado", target = "active"),
@Mapping(source = "categoria", target = "category")
})
Product toProduct(Producto producto);
}
Aquí, aseguramos la transformación precisa de cada atributo, utilizando CategoryMapper para manejar las conversiones involucradas con el atributo categoria.
Manejo de listas y conversión inversa
La interfaz también debería incluir métodos para manejar listas de productos y realizar la conversión inversa:
List<Product> toProducts(List<Producto> productos);
@InheritInverseConfiguration
Producto toProducto(Product product);
@Mapping(target = "codigoBarras", ignore = true)
Estos métodos optimizan la gestión de múltiples productos y aseguran que todos los casos de uso de conversión están cubiertos de manera eficiente.
¿Qué beneficios ofrece MapStruct en el desarrollo?
MapStruct simplifica la configuración de mapeadores, lo que reduce el tiempo de desarrollo e incrementa la legibilidad, mantenibilidad y precisión de las conversiones de datos. Incentiva a los desarrolladores a estructurar su código de manera modular y reutilizable.
Reflexionar sobre cómo estos mapeadores integran diferentes capas en tu aplicación te abrirá a implementar soluciones más efectivas y robustas en futuros proyectos. Continúa explorando y dominando herramientas como MapStruct para maximizar la eficiencia de tu desarrollo.