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

Orientar nuestra API al dominio con MapStruct

22/41
Recursos

Aportes 31

Preguntas 15

Ordenar por:

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

No hice caso al viajero del tiempo de no tratar de implementar la Aplicación en Inglés desde el principio 😃
A rehacer, mejor más aprendemos!

Excelente! Me impresiona la manera en la que mapstruct simplifica el código.

Esto del mapper, si me revento la cebeza

En java antes de saber que existe mapStruct usaba ModelMapper,
el uso es mas simple en modelMapper si se trata de convertir clases con atributos con el mismo nombre por ejemplo de Categoria a CategoriaDto con los mismos atributos, veo que con mapStruct la configuracion es mucho más simple para indicar por ejemplo en este caso atributo con atributo de diferente nombre.

A alguien mas al compilar les dice que productos no está dentro de categoria?

Muy buen aporte! Ejemplos muy útiles para aprovechar mapstruct.

Bendito viajero del tiempo.

Tengo entendido que a la hora de crear Interfaces es buena practica anteponer una i mayúscula, para denotar que se trata de una interfaz y no una clase.

Algo así
Interface: ICategoryMapper -> fijense en la (i) que viene primero.

Buenas no me carga el vídeo 22, pase al vídeo 23 y funciona perfecto

Codigo de la clase

@Mapper(componentModel = "spring")
public interface CategoryMapper {
    @Mappings({
            @Mapping(source = "idCategoria", target = "categoryId"),
            @Mapping(source = "descripcion", target = "category"),
            @Mapping(source = "estado", target = "active"),
    })
    Category toCategory(Categoria categoria);

    @InheritInverseConfiguration
    @Mapping(target = "productos", ignore = true)
    Categoria toCategoria(Category category);
}

para ignorar un atributo se escribe el siguiente codigo , se ignora los campos que se relacciona con otras tablas o campos que no necesitemos, siempre se debe ignorar si no se agrega en los campos Mappings

@Mapping(target = "nombreCampo", ignore = true)

dfghdgfhdf

Para los que tengan problemas con el @Data de lombok, nn vez de usar @Data se deben usar @Getter y @Setter, así el lombok no genera problemas.
Adicional colocar annotationProcessor:

implementation 'org.projectlombok:lombok:1.18.22'
    annotationProcessor 'org.projectlombok:lombok:1.18.22'

La anotación @Mappings no es necesaria (al menos en versiones recientes). Por ejemplo, en el mapper de productos pueden tener lo siguiente:

@Mapping(source = "idProducto", target = "productId")
@Mapping(source = "nombre", target = "name")
Product toProducto(Producto producto)
@Mapper(componentModel = "spring", uses = {CategoryMapper.class})
public interface ProductMapper {
    @Mappings({
            @Mapping(source = "idProducto", target = "productId"),
            @Mapping(source = "nombre", target = "name"),
            @Mapping(source = "idCategoria", target = "categoryId"),
            @Mapping(source = "precioVenta", target = "price"),
            @Mapping(source = "cantidadStock", target = "stock"),
            @Mapping(source = "estado", target = "active"),
            @Mapping(source = "categoria", target = "category"),
    })
    Product toProduct(Producto producto);
    List<Product> toProducts(List<Producto> productos);

    @InheritInverseConfiguration
    @Mapping(target = "codigoBarras", ignore = true)
    Producto toProducto(Product product);
}

Para indicarle a Spring que tiene que pasar el campo categoria a Category debe usar CategoryMapper.class

@Mapper(componentModel = "spring", uses = {CategoryMapper.class})

Hola Alejandro, no resulta el mapstruct con vsc, pero si con intellij… sabes o alguien sabe como poder habilitarlo para vsc…?

Gracias 😃

Es normal que en este punto si ejecuto la aplicacion obtenga el siguiente error:
error: No property named “idCreacion” exists in source parameter(s). Did you mean “null”?
@Mapping(source = “idCreacion”, target = “id”)

Cabe recalcar que estoy usando otra base de datos y por ende otras entidades, sin embargo me he guiado completamente del curso, cambiando solo el nombre o tipo de variable

Genial! lo que yo solía hacer (hasta ahora) era crear una clase entidad para la persistencia de los datos y creaba dos clases aparte para las peticiones y las respuestas de este objeto para la API.

Si las variables se llaman igual, no es necesario hacer el @Mapping. La utilidad sería entonces por ejemplo no mapear algunas variables (en este caso el código de barras, por ejemplo).

A veces algunas columnas se llaman igual y otras no, por ejemplo “email” a veces lo llaman igual en bases de datos en español, entonces no sería necesario hacer el mapping de esta.

Dudo mucho que en un proyecto real exista el espanglish que hay metido aqui, esto es un desastre, en mi opinion 😦

Es importante que todas las variables que están en los entitys tengan getter and setter, si no después no compilaran.

MapStruct

Mapear los entity a las objetos de dominio (Hacer el traductor entre la capa de la persistencia y la capa de dominio=

Mapear atributos que son clases.

Enorme diferencia en simplicidad con respecto a ModelMapper

al compilar spring no encuentra el mapper con autowired . alguien tiene ese error ?

Para que sirve agregar este metodo?
List<Product> toProducts(List<Producto> productos);
y porque en categoria no hicimos algo parecido?

y si la bd esta en ingles … y las clases en ingles…se necesita igual mapear?..

A alguien mas no le carga este video?

Si estás usando lombok debes incluir el annotationProcessor para que te funcione el mapper.

dependencies {
...
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
}
¿Dónde se puede leer teoría acerca de esta arquitectura?

No me quedo claro como es que esto:
@Mapping(source = “categoria”, target = “category”)

Sabe que tiene que usar este mappeador?
uses = {CategoryMapper.class}

No veo donde se haga la relacion entre los nombres category y CategoryMapper.class.