1
resposta

Código perfeitamente igual com o do professor, mas, lançando um exceção inesperada.

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
1 resposta

Oi!

Pode ser a versão da biblioteca GSON.

No curso foi utilizada a versão 2.10.1, mas pela mensagem de erro do seu projeto você baixou a versão 2.8.9