Tenho essa primeira classe com o método main
(Censurei minha apikey, mas no meu código, ela está digitada da maneira correta)
package screenwatch.runner;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Scanner;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import screenwatch.models.TitleOMDB;
public class MainAPI {
public static void main(String[] args) throws IOException, InterruptedException {
Scanner input = new Scanner(System.in);
System.out.print("Enter the movie you want: ");
String userInput = input.nextLine().replace(" ", "+");
// Start of http connection.
final String apiURL = "https://www.omdbapi.com/?t=";
final String apiKey = "&apikey=...";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(apiURL + userInput + apiKey)).build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// End of http connection.
String json = response.body();
System.out.println(json);
Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();
TitleOMDB titleOMDB = gson.fromJson(json, TitleOMDB.class);
System.out.println(titleOMDB);
}
}
E uma segunda classe, na verdade, um record, a qual sua declaração é:
package screenwatch.models;
public record TitleOMDB(String title, String year, String runtime) {
}
E estou recebendo uma exceção, a qual exibe o seguinte no console:
Exception in thread "main" java.lang.AssertionError: AssertionError (GSON 2.8.9): java.lang.IllegalAccessException: Can not set final java.lang.String field screenwatch.models.TitleOMDB.title to java.lang.String
at com.google.gson.Gson.fromJson(Gson.java:980)
at com.google.gson.Gson.fromJson(Gson.java:928)
at com.google.gson.Gson.fromJson(Gson.java:877)
at com.google.gson.Gson.fromJson(Gson.java:848)
at screenwatch.runner.MainAPI.main(MainAPI.java:40)
Caused by: java.lang.AssertionError: java.lang.IllegalAccessException: Can not set final java.lang.String field screenwatch.models.TitleOMDB.title to java.lang.String
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:228)
at com.google.gson.Gson.fromJson(Gson.java:963)
... 4 more
Caused by: java.lang.IllegalAccessException: Can not set final java.lang.String field screenwatch.models.TitleOMDB.title to java.lang.String
at java.base/jdk.internal.reflect.FieldAccessorImpl.throwFinalFieldIllegalAccessException(FieldAccessorImpl.java:137)
at java.base/jdk.internal.reflect.FieldAccessorImpl.throwFinalFieldIllegalAccessException(FieldAccessorImpl.java:141)
at java.base/jdk.internal.reflect.MethodHandleObjectFieldAccessorImpl.set(MethodHandleObjectFieldAccessorImpl.java:103)
at java.base/java.lang.reflect.Field.set(Field.java:820)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:133)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
... 5 more