- Crear una interfaz básica de MapStruct que permita mapear de un objeto
Visita
a un objetoVisitaDto
y viceversa. - Crear mapeos cuando el nombre de origen es diferente al nombre destino; por ejemplo: fecha -> fechaProgramada.
- Tener instalado el IDE IntelliJ Idea Community Edition con el plugin de Lombok activado.
- Tener instalada la última versión del JDK 11 o 17.
- Crea un proyecto Maven desde IntelliJ Idea (este proyecto No deberá ser creado con Spring Initilizr).
- Agrega las dependencias de MapStruct en el archivo pom.xml.
- Agrega el plugin de preprocesamiento de MapStruct.
- Agrega una clase
Principal
que tenga un métodomain
. - Agrega una clase
Visita
con los siguientes atributos (debes agregar también los métodos getter y setter de cada atributo):- private long id;
- private LocalDateTime fechaProgramada;
- private String direccion;
- private String proposito;
- private String vendedor;
- Agrega una clase
VisitaDto
con los siguientes atributos (debes agregar también los métodos getter y setter de cada atributo):- private LocalDateTime fecha;
- private String lugar;
- private String proposito;
- private String nombreVendedor;
- Crea una interface
VisitaMapper
decorada con la anotación@Mapper
y agrega un método que permita convertir de un objetjoVisita
aVisitaDto
y un método que permita convertir de un objetoVisitaDto
aVisita
. - Crea un par de objetos en el método
main
de la clasePrincipal
para comprobar que todo está funcionando de forma correta.
Solución
1. Crea un proyecto **Maven** desde el IDE IntelliJ Idea. Este proyecto No deberá ser creado con Spring Initilizr.- Agrega al proyecto, en el archivo pom.xml las dependencias de MapStruct:
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
- En el caso de MapStruct también hay que agregar un plugin de Maven, el cual se encargará de generar el código para realizar el mapeo correspondiente.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
- Crea un nuevo paquete llamado
org.bedu.java.backend.sesion5.ejemplo2
y adentro crea una clase llamadaPrincipal
que tenga un métodomain
de la siguiente forma:
public class Principal {
public static void main(String[] args) {
}
}
- Crea un subpaquete llamado
model
y adentro de este una clase llamadaVisita
con los siguientes atributos:
private long id;
private LocalDateTime fechaProgramada;
private String direccion;
private String proposito;
private String vendedor;
Coloca también sus métodos getter y setter.
- Agrega, a la altura de
model
un paquete llamadodtos
. Adentro de este agrega una clase llamadaVisitaDto
con los siguientes atributos:
private LocalDateTime fecha;
private String lugar;
private String proposito;
private String nombreVendedor;
No olvides colocar también sus métodos getter y setter.
-
Dentro del paquete dtos agrega un subpquete llamado mappings.
-
Dentro del paquete
mappings
crea una interface llamadaVisitaMapper
y decórala con la anotación@@Mapper
:
@Mapper
public interface VisitaMapper {
}
- Agrega los siguientes métodos dentro de la interface
VisitaMapper
, el primero le dice a MapStruct que debe crear un método que transforme de unVisita
(que recibe como parámetro) a unVisitaDto
(que es el objeto que el método regresará). El segundo método hace lo opuesto, recibe un objetoVisita
y regresa un objetoVisitaDto
con los atribtos mapeados provenientes delCliente
. MapStruct se encargará de crear una implementación de esta interface.
VisitaDto visitaToVisitaDto(Visita visita);
Visita visitaDtoToVisita(VisitaDto visitaDto);
- Decora cada uno de los métodos con las anotaciones
@Mappings
y@Mapping
indicando los nombres de los atributos de origen y destino de cada mapeo.
@Mapper
public interface VisitaMapper {
@Mappings({
@Mapping(source = "fechaProgramada", target = "fecha"),
@Mapping(source = "vendedor", target = "nombreVendedor"),
@Mapping(source = "direccion", target = "lugar")
})
VisitaDto visitaToVisitaDto(Visita visita);
@Mappings({
@Mapping(source = "fecha", target = "fechaProgramada"),
@Mapping(source = "nombreVendedor", target = "vendedor"),
@Mapping(source = "lugar", target = "direccion")
})
Visita visitaDtoToVisita(VisitaDto visitaDto);
}
- En el método
main
crea una una instancia deVisita
colocando valores en sus atributos y luego crea una instancia de la clase que implementa la interfaceVisitaMapper
y que es creada por MapStruct. Por default esta clase tendrá el mismo nombre que nuestra interface, agregandoImpl
al final:
Visita visita = new Visita();
visita.setDireccion("Oficina del cliente");
visita.setFechaProgramada(LocalDateTime.now().plusDays(5));
visita.setProposito("Presentar nuevos productos");
visita.setVendedor("Juan Pérez");
VisitaMapper mapper = new VisitaMapperImpl();
- Usando esta instancia usa el método
visitaToVisitaDto
e imprime los valores de los atibutos del objetoVisita
obtenido:
VisitaDto visitaDtoMapeada = mapper.visitaToVisitaDto(visita);
System.out.printf("Propósito: %s%n", visitaDtoMapeada.getProposito());
System.out.printf("Fecha de visita: %s%n", visitaDtoMapeada.getFecha());
System.out.printf("Vendedor: %s%n%n", visitaDtoMapeada.getNombreVendedor());
En la consola de salida debe haber un mensaje similar al siguiente:
- Has lo mismo pero ahora creando una instancia de
VisitaDto
e imprimiendo los valores del objetoVisita
mapeado:
VisitaDto visitaDto = new VisitaDto();
visitaDto.setFecha(LocalDateTime.now().plusDays(7));
visitaDto.setLugar("Casa del cliente");
visitaDto.setNombreVendedor("Juan Manuel");
visitaDto.setProposito("Presentación de nuevos productos");
Visita visitaMapeada = mapper.visitaDtoToVisita(visitaDto);
System.out.printf("Propósito: %s%n", visitaMapeada.getProposito());
System.out.printf("Fecha de visita: %s%n", visitaMapeada.getFechaProgramada());
System.out.printf("Vendedor: %s%n", visitaMapeada.getVendedor());