Antes de empezar

1

Pasos para aprender Java Spring

2

¿Java sigue siendo gratuito?

3

Instalación de ambiente de desarrollo: Linux Ubuntu

4

Instalación de ambiente de desarrollo: macOS

5

Instalación de ambiente de desarrollo: Windows

Introducción a Spring boot

6

¿Qué es y qué usaremos de Spring?

7

Conocer qué es una aplicación autocontenida

8

Crear nuestra aplicación con Spring Initializr

9

Hola mundo con Spring Boot

10

Configurar Spring Boot

11

Crear la estructura del proyecto

Spring Data

12

¿Qué es JPA?

13

Conocer qué es Spring Data

14

Conectar la base de datos a nuestra aplicación

15

Mapear las tablas como clases

16

Crear Entity cuando su clave primaria es compuesta

17

Mapear relaciones entre clases

18

Usar la interface CrudRepository

19

Query Methods

Construyendo nuestra API

20

Implementar la anotación @Repository

21

¿Qué es el patrón Data Mapper y qué resuelve?

22

Orientar nuestra API al dominio con MapStruct

23

Orientar nuestro repositorio a términos del dominio

24

Inyección de dependencias

25

Implementar la anotación @Service

26

Implementar la anotación @RestController

27

Exponer nuestra API

Mejorando nuestra API

28

Controlar las respuestas HTTP

29

Crear el dominio de compras

30

Mapear el dominio de compras

31

Crear el repositorio de compras

32

Probando nuestros servicios de compras

33

Documentar nuestra API con Swagger

Spring Security

34

Configurar la seguridad de nuestra API con Spring Security

35

Generar un JWT

36

Autenticación con JWT

37

Autorización con JWT

Despliegue de nuestra aplicación

38

Desplegar nuestra API desde la ventana de comandos

39

Desplegar nuestra base de datos con Heroku

40

Desplegar nuestra API con Heroku

41

Conclusiones y despedida del curso

Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso de Java Spring

Curso de Java Spring

Alejandro Ramírez

Alejandro Ramírez

Mapear el dominio de compras

30/41
Recursos

Aportes 12

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

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.

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. 😃

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 ?

En la clase destino siempre deben hacerse todos los mappings, si no se tienen todos los atributos mapeados, se tienen que ignorar explícitamente

Yo uso Lombok para evitar escribir los getter and setter, esto es una buena practica?

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

Si tiene un error que dice

Unknown property “compra” in result type ComprasProducto. Did you mean “total”?

  • Es porque en la clase ComprasProductos.java tienen que agregar los setters and getters que faltan
@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);

}