2
respostas

[Dúvida] Me explique o conceito desse trecho pfv

Ola boa noite, me explique tanto o que cada objeto faz sozinho, e depois como eles funcionam em conjunto, ja pesquisei de todas as formas e ñ entendi ainda, me ajude pfvv

CollectionType lista = mapper.getTypeFactory()
.constructCollectionType(List.class, classe);

    return mapper.readValue(json, lista);
2 respostas

Olá, Pedro. Boa noite!

Pode respirar fundo e relaxar: esse trecho de código assusta mesmo da primeira vez que olhamos para ele. Ele envolve alguns conceitos avançados do ecossistema Java e da biblioteca Jackson (que é o motor que o Spring Framework usa por baixo dos panos para converter JSON em objetos Java).

Vamos quebrar esse bicho de sete cabeças. Primeiro, vou te explicar o que cada elemento faz isoladamente e, depois, como eles se unem para realizar a mágica.


O que cada objeto faz sozinho

1. mapper (ObjectMapper)

Este objeto é uma instância da classe ObjectMapper da biblioteca Jackson. Pense nele como um tradutor universal. A principal função dele é pegar uma String no formato JSON e transformar em um objeto Java (e vice-versa).

2. getTypeFactory()

A "Factory" (Fábrica) é um canivete suíço do Jackson usado para construir descrições de tipos complexos de dados. O Java puro tem uma característica chamada Type Erasure (apagamento de tipo), o que significa que, em tempo de execução, o Java esquece se uma List é de Strings, de Números ou de uma classe sua. O getTypeFactory() é quem permite contornar isso e criar uma definição de tipo completa.

3. constructCollectionType(List.class, classe)

Este método é o operário da fábrica. Ele serve para montar a estrutura de uma coleção.

  • List.class: Diz que a estrutura externa será uma lista Java (java.util.List).
  • classe: É uma variável (do tipo Class<T>) que representa a sua classe mapeada (como Livro.class, Serie.class, etc.).

4. lista (CollectionType)

Este objeto guarda o resultado da montagem acima. Ele não possui os dados ainda; ele é apenas um molde detalhado. Ele diz explicitamente para o Jackson: "Ei, eu sou o molde de uma lista que deve conter especificamente objetos do tipo X dentro dela".


Como eles funcionam em conjunto

Imagine que você tem uma caixa com blocos de montar (o seu banco de dados ou a API que devolve um JSON) e você quer transformá-los em carrinhos de plástico (os seus Objetos Java), mas você precisa fazer isso em lote.

[ JSON (Texto) ] ──( Através do Molde: List<Classe> )──> [ Objetos Java Prontos ]

Aqui está o passo a passo do fluxo do seu código:

  1. mapper.getTypeFactory() abre as portas da fábrica de tipos.
  2. .constructCollectionType(List.class, classe) pega as duas peças (List.class + a sua classe) e monta o molde tridimensional de uma lista personalizada. O resultado fica guardado na variável lista.
  3. Na linha final, o mapper.readValue(json, lista) entra em ação. O tradutor (mapper) pega a String bruta (json) que veio da API, olha para o molde que você acabou de fabricar (lista) e começa a despejar os dados dentro dele.

No final, o return devolve para o seu sistema uma List perfeitamente preenchida, onde cada item do JSON virou um objeto Java do tipo que você pediu, prontinho para ser usado com Lambdas e Streams!

Deu para clarear o conceito agora? Se você quiser, poste aqui o método completo onde esse trecho está inserido para vermos como a variável classe está chegando ali!

Olá Evandro, entendi bastante obggg pela explicação.

então o CollectionType será tipo o molde da lista, para indicar que ela tera tipos complexos?
o getTypeFactory() contorna o Type erasure do java, meio que rotulando a lista como tipo complexo?
e o constructCollectionType vai executar as informações de tipos complexas passadas anteriormente? uma duvida, sempre que ele for chamado ele vai tratar de Lista? ou pode ser outros tipos de dados?
desde já obggg pela ajuda

CollectionType lista = mapper.getTypeFactory()
            .constructCollectionType(List.class, classe);