- 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 los 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("[email protected]"); 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());