1
resposta

[Dúvida] Substituir o Record em versões mais antigas do Java

Olá. Estou fazendo o curso Java: consumindo API, gravando arquivos e lidando com erros, onde é utilizado o Record pra trabalhar com o gson. No entanto, minha versão do java é a 8, na qual esse recurso aparentemente ainda não tinha sido colocado. Como posso substui-lo? O que eu preciso fazer é:

String json = response.body();
            System.out.println(json);
            
            Gson gson = new Gson();
            TituloOmdb meuTituloOmdb = gson.fromJson(json, TituloOmdb.class);
            System.out.println(meuTituloOmdb);

Utilizando o record, ficaria:

public record TituloOmdb (String title, String year, String runtime) {
}

O objetivo é passar o json gerado por uma busca numa API e criar um objeto dessa classe TituloOmdb com essas especificações passadas no parâmetro. Mas ao tentar fazer isso com Record ele me dá esse erro:

*Digite o nome do filme para busca: 
batman
{"Title":"Batman","Year":"1989","Rated":"PG-13","Released":"23 Jun 1989","Runtime":"126 min","Genre":"Action, Adventure","Director":"Tim Burton","Writer":"Bob Kane, Sam Hamm, Warren Skaaren","Actors":"Michael Keaton, Jack Nicholson, Kim Basinger","Plot":"The Dark Knight of Gotham City begins his war on crime with his first major enemy being Jack Napier, a criminal who becomes the clownishly homicidal Joker.","Language":"English, French, Spanish","Country":"United States, United Kingdom","Awards":"Won 1 Oscar. 11 wins & 28 nominations total","Poster":"https://m.media-amazon.com/images/M/MV5BZWQ0OTQ3ODctMmE0MS00ODc2LTg0ZTEtZWIwNTUxOGExZTQ4XkEyXkFqcGdeQXVyNzAwMjU2MTY@._V1_SX300.jpg","Ratings":[{"Source":"Internet Movie Database","Value":"7.5/10"},{"Source":"Rotten Tomatoes","Value":"76%"},{"Source":"Metacritic","Value":"69/100"}],"Metascore":"69","imdbRating":"7.5","imdbVotes":"402,377","imdbID":"tt0096895","Type":"movie","DVD":"24 Jul 2014","BoxOffice":"$251,409,241","Production":"N/A","Website":"N/A","Response":"True"}
Exception in thread "main" java.lang.RuntimeException: Unable to invoke no-args constructor for class br.com.alura.screenmatch2.modelos.TituloOmdb. Register an InstanceCreator with Gson for this type may fix this problem.
    at gson@2.6.2/com.google.gson.internal.ConstructorConstructor$14.construct(ConstructorConstructor.java:226)
    at gson@2.6.2/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:206)
    at gson@2.6.2/com.google.gson.Gson.fromJson(Gson.java:879)
    at gson@2.6.2/com.google.gson.Gson.fromJson(Gson.java:844)
    at gson@2.6.2/com.google.gson.Gson.fromJson(Gson.java:793)
    at gson@2.6.2/com.google.gson.Gson.fromJson(Gson.java:765)
    at screenmatch2/br.com.alura.screenmatch2.principal.PrincipalComBusca.main(PrincipalComBusca.java:37)
Caused by: java.lang.UnsupportedOperationException: Cannot allocate class br.com.alura.screenmatch2.modelos.TituloOmdb
    at gson@2.6.2/com.google.gson.internal.UnsafeAllocator$4.newInstance(UnsafeAllocator.java:100)
    at gson@2.6.2/com.google.gson.internal.ConstructorConstructor$14.construct(ConstructorConstructor.java:223)
    ... 6 more*

Como resolver?

1 resposta

Carolina, boa tarde Tudo bem?

Como você está utilizando a lib Gson, na classe record TituloOmdb você terá de informar qual o nome correto do json que está recebendo Percebe-se que você passou String titulo com o "T" minusculo e o response da sua api está com "T" maiusculo nesse caso você tem de adicionar @SerializedName com o valor que está recebendo do json para cada atributo que quer referenciar.