No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Aprende Ingl茅s, Programaci贸n, AI, Ciberseguridad y mucho m谩s.

Antes: $249

Currency
$209
Suscr铆bete

Termina en:

3 D铆as
7 Hrs
4 Min
6 Seg
Curso de Java Spring

Curso de Java Spring

Alejandro Ram铆rez

Alejandro Ram铆rez

Orientar nuestra API al dominio con MapStruct

20/35
Recursos

Aportes 54

Preguntas 31

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

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!

Esto del mapper, si me revento la cebeza

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

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?

Bendito viajero del tiempo.

Creaci贸n de mappers

  • Creaci贸n de paquete llamado 鈥渕apper鈥 en el paquete 鈥減ersistence鈥.

  • Se crean como interface

  • A cada clase se le a帽ade el sufijo 鈥淢apper鈥.

  • Se le a帽ade a la clase la anotaci贸n @Mapper

  • MapStruct nos ofrece una integraci贸n con Spring. Se le especifica a la anotaci贸n: @Mapper(componentModel = "spring")

  • Se especifica la conversi贸n: Category toCategory(Categoria categoria);. Se convertir谩 un entity de tipo Categoria a un dominio de tipo Category.

  • Se a帽ade la siguiente estructura de anotaciones:

    @Mappings({
    	@Mapping(source = "idCategoria", target = "categoryId"),
    	@Mapping(source = "descripcion", target = "category"),
    })
    Category toCategory(Categoria categoria);
    
  • Se debe hacer el mapeo en sentido contrario. Con la anotaci贸n @InheritInverseConfiguration

    • Adem谩s, se ignoran los atributos que no se deseen incluir: @Mapping(target = "productos", ignore = true)
    @InheritInverseConfiguration
    @Mapping(target = "productos", ignore = true)
    Categoria toCategoria(Category category);
    
  • Cuando se mapea un atributo que es de una clase que tiene su mapper propio, dentro de la anotaci贸n @Mapper, se a帽ade algo como lo siguiente: @Mapper(componentModel = "spring", uses = {CategoryMapper.class})

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

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.

Si les marca error al hacer el mapeo de categorias y productos a mi me lo soluciono el poner los setters y getters

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)

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'

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

@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})

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 鈥渆mail鈥 a veces lo llaman igual en bases de datos en espa帽ol, entonces no ser铆a necesario hacer el mapping de esta.

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

Es normal que en este punto si ejecuto la aplicacion obtenga el siguiente error:
error: No property named 鈥渋dCreacion鈥 exists in source parameter(s). Did you mean 鈥渘ull鈥?
@Mapping(source = 鈥渋dCreacion鈥, target = 鈥渋d鈥)

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

La primera vez que lo vi no entendi mucho, pero me tome un break regrese y lo vi a 0.85x y lo entendi todo.

MaspStruct es muy 煤til cuando se trabaja en proyectos peque帽os, pero ya cuando nos enfrentamos a proyectos m谩s grandes, se puede tornar confuso y dif铆cil de mantener. Tambi茅n encontr茅 algunos problemas de compatibilidad con las versiones actuales, ya que han venido cambiando la forma de hacer este mapper, sobre todo en la 1.5.2, ya que no es muy amigable con spring y las entity.

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)

dfghdgfhdf

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

Gracias 馃槂

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

Vamos a crear los mappers para transformar los categories en categorias y products en productos, es como hacer un puente entre las definiciones de entitis

MapStruct es bastante fiable, me faltaban algunos getters/setters de las clases y el compilador es bastante espec铆fico con lo que hace falta, bastante 煤til en caso de hacer refactoring para alg煤n property que suele pasar aunque de todas formas haya que hacer los ajustes en los strings que definen las relaciones

Me encanta que Spring Boot no reinveta la rueda y 99% de las cosas que se ocupan en el backend ya est谩n hechas, simplemente es saber como usar bien las anotaciones y la inyecci贸n de dependencia

No me quedo claro como es que esto:
@Mapping(source = 鈥渃ategoria鈥, target = 鈥渃ategory鈥)

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

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

驴D贸nde se puede leer teor铆a acerca de esta arquitectura?

y si la bd esta en ingles 鈥 y las clases en ingles鈥e necesita igual mapear?..

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

Sigo sin entender la funci贸n del mapping, mejor de una vez los nombres en ingles no? Y nos ahorramos todo esto.

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.

驴Es posible construir el aplicativo sin el uso de MapStruct? Es decir, sin depender de generadores de c贸digo externos como este.
El uso de Mapper me dejo loco, con lo facil que queda. Ya habia usado uno con los DTO pero tocaba que las clases se llamaran igual y no era la idea. Se me ocurre que debe existir o se podria crear una herramienta que agarrando las clases se peuda crear mas rapido y tal vez grafico los mapper, porque veo que es una tarea muy mecanica.
No me permite correr la aplicaci贸n por unos errores que me salen ahi, segun los comentarios dicen que si tiene los getter y settter pero si los tienen. ![](https://static.platzi.com/media/user_upload/image-b27753d5-3c1e-44e4-9c33-cce8553d05f2.jpg)Justamnente son los mapper ![](https://static.platzi.com/media/user_upload/image-67e1a038-f068-415a-ba9c-e7c9923fa3df.jpg) Segun sale como que no los reconoce pero ya estan agregados arriba en con el class..... y no puedo abrir el proyecto en el ecplise spring boot porque dice que esta da帽ado el .project pero esta bien. ![](https://static.platzi.com/media/user_upload/image-39a0fc1c-833f-4c60-9786-337809f8e900.jpg) ya le di mil vueltas desde el a帽o pasado y nada...
En la notaci贸n inicial se puede agregar lo siguiente `@Mapper(componentModel = "spring",` ` unmappedSourcePolicy = ReportingPolicy.``IGNORE``,` ` unmappedTargetPolicy = ReportingPolicy.``IGNORE``)` con la politica de IGNORE como una opci贸n generalizada de `@Mapping(target = "productos", ignore = true)`
Buenas despues de hacer los mappers no me deja ejecutar el proyecto, estoy teniendo dos errores relacionados con los mappers, adjunto foto de los errores y los ficheros se帽alando donde se producen pero no entiendo por que, segun ![]()creo no deber![]()ian de estar produciendose
GG
Que pasa si la empresa para la que trabajo no me permite usar IntelliJ? lo que aprend铆 con MapStruct se va al ca帽o y no sabre que hacer... Pienso que al ser cursos iniciales para la mayor铆a no deber铆an implementar este tipo de herramientas, si no, hacer de la manera nativa... Ya me decepcione del curso....

Chale todo hiba bien hasta esta clase 馃ゲ馃槶, hay que hacer ajustes para que compile el proyecto

Muy bien explicado todo.

Hermoso como me simplific贸 todo el c贸digo de mappeo de DTO a Entity y viceversa en mis proyectos personales y en el trabajo. Much铆simas gracias.

Quien tenga problemas con @Mapper y el plugin, es porque a partir de la version 1.5.0 de Mapstruct el pluggin omitio esta anotacion, por eso instalen la version 1.3.0

Que genial clase. Este tema en especial, me vol贸 el cerebro. P谩rrafo aparte para el profesor, que es un genio y explica muy bien.

驴Y qu茅pasa con los java expressions y los imports? 驴y los decoradores?

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

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

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'
}