Neste artigo, aprenderemos como usar o mapeador personalizado comMapStruct library.
The MapStruct library is used for mapping between Java bean types. Usando um mapeador personalizado com MapStruct,we can customize the default mapping methods.
2. Dependências do Maven
Vamos adicionar a bibliotecamapstruct-jdk8 em nosso Mavenpom.xml:
org.mapstructmapstruct-jdk81.3.0.Final
Para ver os métodos gerados automaticamente dentro dotarget folder do projeto, temos que adicionarannotationProcessorPaths ao pluginmaven-compiler-plugin:
Mapeadores personalizados são usados para resolver requisitos de conversão específicos. Para conseguir isso, precisamos definir um método para fazer a conversão. Em seguida, devemos notificar o MapStruct sobre o método Por fim, o MapStruct chamará o método para fazer a conversão da origem para o destino.
Por exemplo, vamos imaginar que temos um aplicativo que calcula o relatório de índice de massa corporal (IMC) do usuário. Para calcular o IMC, temos que coletar os valores corporais do usuário. Para converter unidades imperiais em unidades métricas, podemos usar os métodos do mapeador personalizado.
Existem duas maneiras de usar um mapeador personalizado com o MapStruct. We can either call the custom method by typing it inside the @Mapping annotation’s qualifiedByName property, or we can create an annotation for it.
Antes de começarmos, precisamos definir uma classe de DTO para manter os valores imperiais:
public class UserBodyImperialValuesDTO {
private int inch;
private int pound;
// constructor, getters, and setters
}
A seguir, vamos definir uma classe DTO para manter os valores métricos:
public class UserBodyValues {
private double kilogram;
private double centimeter;
// constructor, getters, and setters
}
3.1. Mapeador personalizado com método
Para começar a usar mapeadores personalizados, vamos criar uma interface com a anotação@Mapper:
@Mapper
public interface UserBodyValuesMapper {
//...
}
Em segundo lugar, vamos criar nosso método personalizado com o tipo de retorno que queremos e o argumento que precisamos converter. Temos que usar a anotação @Named com o parâmetro value para informar o MapStruct sobre o método do mapeador personalizado:
@Mapper
public interface UserBodyValuesMapper {
@Named("inchToCentimeter")
public static double inchToCentimeter(int inch) {
return inch * 2.54;
}
//...
}
E, finalmente, vamos definir o método da interface do mapeador com a anotação@Mapping. Dentro desta anotação, informaremos MapStruct sobre o tipo de origem, tipo de destino e o método que ele usará:
@Mapper
public interface UserBodyValuesMapper {
UserBodyValuesMapper INSTANCE = Mappers.getMapper(UserBodyValuesMapper.class);
@Mapping(source = "inch", target = "centimeter", qualifiedByName = "inchToCentimeter")
public UserBodyValues userBodyValuesMapper(UserBodyImperialValuesDTO dto);
@Named("inchToCentimeter")
public static double inchToCentimeter(int inch) {
return inch * 2.54;
}
}
Para usar um mapeador personalizado com uma anotação, temos que definir uma anotação em vez da anotação@Named. Então, temos que informar MapStruct sobre a anotação recém-criada, especificando o parâmetroqualifiedByName. da anotação @Mapping
Vamos ver como definimos a anotação:
@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface PoundToKilogramMapper {
}
Vamos adicionar a anotação@PoundToKilogramMapper ao nosso métodopoundToKilogram:
Agora, vamos definir o método da interface do mapeador com a anotação@Mapping. Na anotação de mapeamento, informaremos MapStruct sobre o tipo de origem, o tipo de destino e a classe de anotação que ele usará: