1
resposta

Problema com mapstruct

Eaí galera, tudo bem? Pessoal estou tentando implementar no meu projeto o mapstruct, porém, estou tendo um problema ao tentar utiliza-lo. Essa é minha entidade de usuário:

@Data
@Entity
public class Usuario {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @NotBlank
    private String nome;

    @NotBlank
    @Email
    private String email;

    @NotBlank
    private String telefone;

    @NotBlank
    private String senha;
}

Esse é meu Dto de usuário:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UsuarioDtoEntrada {

    @NotBlank
    private String name;

    @NotBlank
    @Email
    private String email;

    @NotBlank
    private String telefone;

    @NotBlank
    private String senha;

}

E essa é minha interface mapstruct:

@Mapper(componentModel = "spring")
public interface UserMapper {

    @Mapping(source = "usuarioDtoEntrada.name", target = "nome")
    Usuario getEntityFromDtoEntrada(UsuarioDtoEntrada usuarioDtoEntrada);
}

Porém, quando eu faço o clean compile e gero o UserMapperImpl, ele gera uma implementação que cria um objeto com todos os valores recebidos, e eu gostaria de poder ter a flexibilidade de apontar quais campos eu quero que sejam preenchidos em determinados atributos do target.

1 resposta

Olá Alexsander, tudo bem?

Pelo que entendi, você está tendo problemas com a implementação do Mapstruct em seu projeto. Aparentemente, o problema está na geração da implementação do UserMapperImpl, que está criando um objeto com todos os valores recebidos, sem a flexibilidade de apontar quais campos você quer que sejam preenchidos em determinados atributos do target.

Uma possível solução para esse problema é utilizar a anotação @Mapping em cada atributo do target que você quer mapear. Dessa forma, você pode especificar qual atributo do source deve ser utilizado para preencher cada atributo do target.

No seu caso, a interface UserMapper ficaria assim:

@Mapper(componentModel = "spring")
public interface UserMapper {

    @Mapping(source = "name", target = "nome")
    @Mapping(source = "email", target = "email")
    @Mapping(source = "telefone", target = "telefone")
    @Mapping(source = "senha", target = "senha")
    Usuario getEntityFromDtoEntrada(UsuarioDtoEntrada usuarioDtoEntrada);
}

Com isso, você deve conseguir mapear apenas os atributos que deseja. Espero ter ajudado e bons estudos!