Un atajo de teclado muy útil para copiar rápidamente líneas de código es ctrl+d
Antes de empezar
¿Qué es y qué usaremos de Spring?
¿Java sigue siendo gratuito?
Instalación de ambiente de desarrollo: Windows
Instalación de ambiente de desarrollo: Linux Ubuntu
Instalación de ambiente de desarrollo: macOS
Introducción a Spring boot
Creando aplicaciones autocontenidas con Spring Initializr
Hola mundo con Spring Boot
Configurar Spring Boot
Crear la estructura del proyecto
Spring Data
¿Qué es JPA?
Conocer qué es Spring Data
Conectar la base de datos a nuestra aplicación
Mapear las tablas como clases
Crear Entity cuando su clave primaria es compuesta
Mapear relaciones entre clases
Usar la interface CrudRepository
Query Methods
Construyendo nuestra API
Implementar la anotación @Repository
¿Qué es el patrón Data Mapper y qué resuelve?
Orientar nuestra API al dominio con MapStruct
Orientar nuestro repositorio a términos del dominio
Inyección de dependencias
Implementar la anotación @Service
Implementar la anotación @RestController
Exponer nuestra API
Mejorando nuestra API
Controlar las respuestas HTTP
Crear el dominio de compras
Mapear el dominio de compras
Crear el repositorio de compras
Probando nuestros servicios de compras
Documentar nuestra API con Swagger
Despliegue de nuestra aplicación
Desplegar nuestra API desde la ventana de comandos
Desplegar nuestra base de datos con Heroku
Desplegar nuestra API con Heroku
Conclusiones y despedida del curso
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Alejandro Ramírez
Aportes 18
Preguntas 4
Un atajo de teclado muy útil para copiar rápidamente líneas de código es ctrl+d
Con respecto a MapStruct desde java 8 en adelante no es necesario usar la anotación @Mappings (No afecta si se usa):
Ejm:
Pasamos de esto (CategoryMapper):
@Mappings({
@Mapping(source = "idCategoria", target = "categoryId"),
@Mapping(source = "descripcion", target = "category"),
@Mapping(source = "estado", target = "active")
})
Category toCategory(Categoria categoria);
a esto:
@Mapping(source = "idCategoria", target = "categoryId")
@Mapping(source = "descripcion", target = "category")
@Mapping(source = "estado", target = "active")
Category toCategory(Categoria categoria);
y no afecta su funcionamiento de las dos maneras funciona.
Cuando hacemos el ignore de producto, agregamos en la etiqueta Mapper uses={ProductMapper.class}, pero también hacemos ignore de compra, no deberíamos agregar también PurchaseMapper en uses ?
Les quiero comentar que tuve un problema con la actualización de lo siguiente:
@Mapping(source = “productos”, target = “items” ),
(al autocompletar luego de cambiar item por items INTELLIJ no actualizaba el auto completar con ITEMS tuve que volver a la clase Purchase.java y quitar el método y volver a generar el getter an setter algo paso con el INTELLIJ. Por si a alguien mas le pasa para que pueda saber como solucionarlo. 😃
Para los que vienen siguiendo paso a paso el ejemplo, en los campos de ComprasProducto que tienen relaciones, no habiamos creado los getters y setters. Me di cuenta porque no me autocompletaba MapStruct dentro de target
Yo uso Lombok para evitar escribir los getter and setter, esto es una buena practica?
En la clase destino siempre deben hacerse todos los mappings, si no se tienen todos los atributos mapeados, se tienen que ignorar explícitamente
El agregar una lista en un Optional se considera un Code Smell, debido a que si no hay datos nos regresa una lista vacía.
Si tiene un error que dice
Unknown property “compra” in result type ComprasProducto. Did you mean “total”?
¡Excelente!
@Mapper(componentModel = "spring", uses = {PurchaseItemMapper.class})
public interface PurchaseMapper {
@Mappings({
@Mapping(source = "idCompra", target = "purchaseId"),
@Mapping(source = "idCliente", target = "clienteId"),
@Mapping(source = "fecha", target = "date"),
@Mapping(source = "medioPago", target = "paymentMethod"),
@Mapping(source = "comentario", target = "comment"),
@Mapping(source = "estado", target = "state"),
@Mapping(source = "productos", target = "items"),
})
Purchase toPurchase(Compra compra);
List<Purchase> toPurchases(List<Compra> compras);
@InheritInverseConfiguration
@Mappings({
@Mapping(target = "cliente", ignore = true)
})
Compra toCompra(Purchase purchase);
}
@Mapper(componentModel = "spring", uses = {ProductMapper.class})
public interface PurchaseItemMapper {
@Mappings({
@Mapping(source = "id.idProducto", target = "productId"),
@Mapping(source = "cantidad", target = "quantity"),
@Mapping(source = "total", target = "total"),
@Mapping(source = "estado", target = "active")
})
PurchaseItem toPurchaseItem(ComprasProducto producto);
@InheritInverseConfiguration
@Mappings({
@Mapping(target = "compra", ignore = true),
@Mapping(target = "producto", ignore = true),
@Mapping(target = "id.idCompra", ignore = true)
})
ComprasProducto toComprasProducto(PurchaseItem purchaseItem);
}
Excelente todo hasta ahora
Me pueden ayudar con este error?
Property “productId” has no write accessor in PurchaseItem
Unknown property “clientId” in result type Purchase
No property named “clientId” exists in source parameters
Unmapped target property “idCliente”
Mi codigo es
package com.Cesar_Market.persistence.mapper;
import com.Cesar_Market.domain.PurchaseItem;
import com.Cesar_Market.persistence.entity.ComprasProductos;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper(componentModel = "spring", uses = {ProductMapper.class})
public interface PurchaseItemMapper {
@Mappings({
@Mapping(source = "id.idProducto", target = "productId"),
@Mapping(source = "cantidad", target = "quantity"),
@Mapping(source = "estado", target = "state")
})
PurchaseItem toPurchaseItem(ComprasProductos producto);
@InheritInverseConfiguration
@Mappings({
@Mapping(target = "compra", ignore = true),
@Mapping(target = "producto", ignore = true),
@Mapping(target = "id.idCompra", ignore = true)
})
ComprasProductos toComprasProducto(PurchaseItem item);
}```
package com.Cesar_Market.persistence.mapper;
import com.Cesar_Market.domain.Purchase;
import com.Cesar_Market.persistence.entity.Compra;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import java.util.List;
@Mapper(componentModel = “spring”, uses = {PurchaseItemMapper.class})
public interface PurchaseMapper {
@Mappings({
@Mapping(source = "idCompra", target = "purchaseId"),
@Mapping(source = "idCliente", target = "clientId"),
@Mapping(source = "fecha", target = "date"),
@Mapping(source = "medioDePago", target = "paymentMethod"),
@Mapping(source = "comentario", target = "comment"),
@Mapping(source = "estado", target = "state"),
@Mapping(source = "comprasProductos", target = "items")
})
Purchase toPurchase(Compra compra);
List<Purchase> toPurchases(List<Compra> compras);
@InheritInverseConfiguration
@Mapping(target = "cliente", ignore = true)
Compra toCompra(Purchase purchase);
}
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?