Segue a resolução do exercício.
Classe TituloOmdb:
package br.com.alura.screenmatch.modelos;
public record TituloOmdb(String title, String year, String runtime) {
}
Classe Titulo:
package br.com.alura.screenmatch.modelos;
import br.com.alura.screenmatch.calculos.Classificavel;
import br.com.alura.screenmatch.excecao.ErroDeConversaoDeAPIException;
public class Titulo implements Comparable<Titulo>{
//Apresentada somente a parte necessária para o tratamento da exceção.
...
public Titulo(TituloOmdb tituloOmdb) {
this.nome = tituloOmdb.title();
if (tituloOmdb.year().length() > 4 || tituloOmdb.year().equals("N/A")) {
throw new ErroDeConversaoDeAPIException("Data inconsistente ou não disponível");
} else {
this.anoDeLancamento = Integer.parseInt(tituloOmdb.year());
}
if (tituloOmdb.runtime().equals("N/A")) {
throw new ErroDeConversaoDeAPIException("Duração não disponível");
} else {
this.anoDeLancamento = Integer.parseInt(tituloOmdb.runtime().replaceAll("[^0-9]", ""));
}
}
...
}
Classe ErroDeConversaoDeAPIException:
package br.com.alura.screenmatch.excecao;
public class ErroDeConversaoDeAPIException extends RuntimeException{
private String mensagem;
public ErroDeConversaoDeAPIException(String mensagem){
this.mensagem = mensagem;
}
@Override
public String getMessage() {
return this.mensagem;
}
}
Classe PrincipalComBusca:
package br.com.alura.screenmatch.principal;
import br.com.alura.screenmatch.excecao.ErroDeConversaoDeAPIException;
import br.com.alura.screenmatch.modelos.ConsultaAPI;
import br.com.alura.screenmatch.modelos.Titulo;
import br.com.alura.screenmatch.modelos.TituloOmdb;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class PrincipalComBusca {
public static void main(String[] args) throws IOException, InterruptedException {
Scanner sc = new Scanner(System.in);
System.out.println("Digite o nome do filme: ");
String nomeFilme = sc.nextLine();
String nomeFilmeCodificado = URLEncoder.encode(nomeFilme, StandardCharsets.UTF_8);
String OMDB_API_KEY = "api_key";
String url = "https://www.omdbapi.com/?t=" + nomeFilmeCodificado + "&apikey=" + OMDB_API_KEY;
ConsultaAPI consulta = new ConsultaAPI();
String json = consulta.consultaAPI(url);
System.out.println("Json de retorno da API: " + json);
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
.create();
TituloOmdb tituloOmdb = gson.fromJson(json, TituloOmdb.class);
System.out.println("TítuloOmdb: " + tituloOmdb);
try {
Titulo meuTitulo = new Titulo(tituloOmdb);
System.out.println("Título convertido: " + meuTitulo);
} catch (ErroDeConversaoDeAPIException e) {
System.out.println("Houve um erro!");
System.out.println(e.getMessage());
}
sc.close();
}
}
Output:
Json de retorno da API: {"Title":"Divertidamente","Year":"2018–","Rated":"N/A","Released":"11 Mar 2018",...,"Response":"True"}
TítuloOmdb: TituloOmdb[title=Divertidamente, year=2018–, runtime=N/A]
Houve um erro!
Data inconsistente ou não disponível
Process finished with exit code 0