- Crear una interfaz básica de MapStruct que permita mapear de un objeto
Cliente
a un objetoClienteDto
y viceversa.
- 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 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 llamadaCliente
con los siguientes atributos:
private long id;
private String nombre;
private String correoContacto;
private int numeroEmpleados;
private String direccion;
Coloca también sus métodos getter y setter.
- Agrega, a la altura de
model
un paquete llamadodtos
. Adentro de este agrega una clase llamadaClienteDto
con los siguientes atributos:
private String nombre;
private String numeroEmpleados;
private String direccion;
No olvides colocar también sus métodos getter y setter.
- Dentro del paquete dtos agrega un subpquete llamado mappings.
La estructura del proyecto hasta ahora debe verse así:
- Dentro del paquete
mappings
crea una interface llamadaClienteMapper
y decórala con la anotación@@Mapper
:
@Mapper
public interface ClienteMapper {
}
- Agrega lis siguientes métodos dentro de la interface
ClienteMapper
, el primero le dice a MapStruct que debe crear un método que transforme de unClienteDto
(que recibe como parámetro) a unCliente
(que es el objeto que el método regresará). El segundo método hace lo opuesto, recibe un objetoCliente
y regresa un objetoClienteDto
con los atribtos mapeados provenientes delCliente
. MapStruct se encargará de crear una implementación de esta interface.
Cliente clienteDtoToCliente(ClienteDto clienteDto);
ClienteDto clienteToClienteDto(Cliente cliente);
La interface completa debe verse de esta forma:
@Mapper
public interface ClienteMapper {
Cliente clienteDtoToCliente(ClienteDto clienteDto);
ClienteDto clienteToClienteDto(Cliente cliente);
}
- En el método
main
crea una una instancia deClienteDto
colocando valores en sus atributos y luego crea una instancia de la clase que implementa la interfaceClienteMapper
y que es creada por MapStruct. Por default esta clase tendrá el mismo nombre que nuestra interface, agregandoImpl
al final:
ClienteDto clienteDto = new ClienteDto();
clienteDto.setDireccion("Direccion DTO");
clienteDto.setNombre("Nombre cliente dto");
clienteDto.setNumeroEmpleados("10");
ClienteMapper clienteMapper = new ClienteMapperImpl();
- Usando esta instancia usa el método
clienteDtoToCliente
e imprime los valores de los atibutos del objetoCliente
obtenido:
Cliente clienteMapeado = clienteMapper.clienteDtoToCliente(clienteDto);
System.out.printf("Cliente, dirección: %s%n", clienteMapeado.getDireccion());
System.out.printf("Cliente nombre %s%n", clienteMapeado.getNombre());
System.out.printf("Cliente numero empleados %d%n%n", clienteMapeado.getNumeroEmpleados());
En la consola de salida debe haber un mensaje similar al siguiente:
- Has lo mismo pero ahora creando una instancia de
Cliente
e imprimiendo los valores del objetoClienteDto
mapeado:
Cliente cliente = new Cliente();
cliente.setId(1L);
cliente.setCorreoContacto("correo@cliente.com");
cliente.setDireccion("Dirección cliente");
cliente.setNombre("Nombre cliente");
cliente.setNumeroEmpleados(10);
ClienteDto clienteDtoMapeado = clienteMapper.clienteToClienteDto(cliente);
System.out.printf("ClienteDto, dirección: %s%n", clienteDtoMapeado.getDireccion());
System.out.printf("ClienteDto nombre %s%n", clienteDtoMapeado.getNombre());
System.out.printf("ClienteDto numero empleados %s%n", clienteDtoMapeado.getNumeroEmpleados());