Hola! Durante el video "Otra estructura para representar los datos" el instructor utiliza un record llamado "tituloOmdb.java":
public record TituloOmdb (String title, String year, String runtime){}
gracias al uso de este record y otro método aplicado en el GsonBuilder(), se lograba transformar los datos del Json a un objeto java del tipo tituloOmdb, es aquí cuando surgió una excepción durante la ejecución del código, se veía algo así:
Exception in thread "main" java.lang.AssertionError: AssertionError (GSON 2.9.0): java.lang.IllegalAccessException: Can not set final java.lang.String field com.kcire.screenmatch.modelos.TituloOmdb.title to java.lang.String
at com.google.gson.Gson.fromJson(Gson.java:1008)
at com.google.gson.Gson.fromJson(Gson.java:956)
at com.google.gson.Gson.fromJson(Gson.java:905)
at com.google.gson.Gson.fromJson(Gson.java:876)
at com.kcire.screenmatch.principal.PrincipalConBusqueda.main(PrincipalConBusqueda.java:43)
Caused by: java.lang.AssertionError: java.lang.IllegalAccessException: Can not set final java.lang.String field com.kcire.screenmatch.modelos.TituloOmdb.title to java.lang.String
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:227)
at com.google.gson.Gson.fromJson(Gson.java:991)
... 4 more
En su momento, creí que era algun error en el código que habia hecho, pero luego recorde que estaba usando una versión de Gson distinta a la del video, algo más reciente, en concreto es la versión 2.9.0, por lo que lo más probable es que haya cambiado la forma en la que se transforma un json a un objeto java.
Encontré en algunos foros que la mayoría utilizaban un objeto de tipo Class en lugar de record, eso si, con sus respectivos getters, para poder acceder a sus atributos, así que utilice esta forma para probar si de esta manera podría llegar al mismo resultado en consola que se mostraba en el video, y en efecto se logró, pero quede con la espinita de no poder haberlo hecho con record, ya que en otras publicaciones de este foro se mencionaba que el uso de record era considerado una buena practica.
Por lo anterior, recurro a este foro, para conocer si alguien pudo hacerlo utilizado record en lugar de class, o si como lo comente tuvieron que utilizar un objeto de tipo class para poder utilizar una versión más reciente de la librería Gson :D
Dejo mi clase principal y el objeto que se encarga de recibir los atributos del json, por si a alguien le puedan servir:
public class PrincipalConBusqueda {
public static void main(String[] args) throws IOException, InterruptedException {
Scanner entrada = new Scanner(System.in).useDelimiter("\n");
System.out.println("Escriba el nombre de una pelicula:");
var busqueda = entrada.nextLine();
String direccion = "https://www.omdbapi.com/?t=" + busqueda + "&apikey=tuapikey";
//para hacer request, utilizaremos una arquitectura cliente-servidor
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(direccion))
.build();
HttpResponse<String> response = client
.send(request, HttpResponse.BodyHandlers.ofString());
String json = response.body();
//el body del json, toda la info de la request
System.out.println(json);
//ya esta añadido el jar de Gson a las /File/ProjectStructure/Modules/dependencies/+
//seteamos la politica de recibimiento de atrbutos
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
.create();
TituloOmdb miTituloOmdb = gson.fromJson(json, TituloOmdb.class);
System.out.println(miTituloOmdb.toString());
Titulo miTitulo = new Titulo(miTituloOmdb);
System.out.println(miTitulo)
;
}
}
public class TituloOmdb {
private String title;
private String year;
private String runtime;
// Constructor
public TituloOmdb(String title, String year, String runtime) {
this.title = title;
this.year = year;
this.runtime = runtime;
}
// Getters
public String getTitle() {
return title;
}
public String getYear() {
return year;
}
public String getRuntime() {
return runtime;
}
@Override
public String toString() {
return "TituloOmdb{" +
"title='" + title + '\'' +
", year='" + year + '\'' +
", runtime='" + runtime + '\'' +
'}';
}
}