Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Sugestão] ModelMapper e Records do JAVA 17

Por que não funciona com Records e com classes "normais" funciona?

EXEMPLO A SEGUIR FUNCIONA COM CLASSE

@Getter
public class TesteFormPadrao {

    private String primeiroNome;
    private String sobrenome;
}

EXEMPLO A SEGUIR NÃO FUNCIONA COM RECORD

public record TesteForm(
        String primeiroNome,
        String sobrenome) {
}

MINHA CLASSE DE DOMINIO (ENTITY) ESTÁ TUDO IGUAL PRA FACILITAR

@Getter
@EqualsAndHashCode
public class TesteEntity {

    private String primeiroNome;
    private String sobrenome;

    @Deprecated
    public TesteEntity(){}

    public TesteEntity(String primeiroNome, String sobrenome) {
        this.primeiroNome = primeiroNome;
        this.sobrenome = sobrenome;
    }

}

MEU CONTROLLER ESTÁ DESTA FORMA SIMPLES

@RestController
@RequestMapping("/teste")
public class TesteController {

    @GetMapping
    public TesteEntity retornoDTO(@RequestBody TesteFormPadrao form) {
        ModelMapper modelMapper = new ModelMapper();
        return modelMapper.map(form, TesteEntity.class);
    }    
}

A explicação do chatGPT é que a lib foi desenvolvida ANTES do JDK 17 e como a release OFICIAL dos RECORDS foram nesta versão, embora em forma BETA no JAVA 14 e aperfeiçoada nas versões seguintes, só tomou vida na versão 17 e como o ModelMapper é anterior não fornece suporte ao Records.

Porém, entretanto, todavia... Estou neste dilema:

  1. Sacrifico meus Records, uso "classe normal" e crio um acoplamento com o Lombok pra evitar Boilerplate code;
  2. Faço na mão o mapper de Record pra Entity

Quero discutir aqui se tem alguém que já conseguiu fazer esta gambiarra ou tem uma dica ou sabe se tem alguma lib que trabalhe com RECORDS na chamada do método. Até porque ficar usando lombok não sei se é uma boa prática tendo em vista que muitas empresas não liberam no Nexus a dependência. Enfim... sugestões?

2 respostas

Olá Diego, tudo bem?

Uma boa pergunta .... fiquei curioso!

Diego, tem como testar o seguinte codigo no Record e depois testar ModelMapper?

public record TesteForm(
        String primeiroNome,
        String sobrenome) {

   public TesteForm() {
      this(null, null); 
   }

}

Basicamente adicionei o "default constructor"

abs

solução!

Bom dia, professor! Infelizmente não consegui mesmo adicionando o construtor padrão no Records, assim que voltei para classe normal o modelMapper fez o bind normalmente. Lembrando que estou utilizando JDK17 na última release e SpringBoot 3