Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Reescrevendo o código do projeto Screen Match

No módulo 4, foi sugerido a modificação do código para tornar mais limpo e separar a deserialização e escrita no Json, assim fiz. Gostaria de saber se meu código está bem estruturado e segue as boas práticas de desenvolvimento Java, caso contrário, agradeço se me corrigirem:

PrincipalComBuscas:

package br.com.alura.screenmatch.principal;
import br.com.alura.screenmatch.modelos.Deserializer;
import br.com.alura.screenmatch.modelos.SerializerWriter;
import br.com.alura.screenmatch.modelos.Titulo;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class PrincipalComBuscas {
    public static void main(String[] args) throws IOException, InterruptedException {
        Scanner leitura = new Scanner(System.in);
        String busca = "";
        List<Titulo> titulos = new ArrayList<>();

        while (!busca.equalsIgnoreCase("sair")) {
            System.out.println("Digite um filme para busca: ");
            busca = leitura.nextLine();

            if (busca.equalsIgnoreCase("sair")) {
                break;
            }

            String endereco = "https://www.omdbapi.com/?t=" + busca.replace(" ", "+") + "&apikey=22c150b8";
            titulos.add(Deserializer.jsonToObj(endereco));
            SerializerWriter.objToJson(titulos);
        }
        System.out.println(titulos);
        System.out.println("O programa finalizou corretamente");

    }
}

Deserializer:

package br.com.alura.screenmatch.modelos;

import br.com.alura.screenmatch.excessao.ErroDeConversaoDeAnoException;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Deserializer {
    public static Titulo jsonToObj(String endereco) throws IOException, InterruptedException {
        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .setPrettyPrinting()
                .create();
        Titulo meuTitulo = null;
        try {
            HttpClient client = HttpClient.newHttpClient(); // Cria o client (quem vai fazer o pedido)
            HttpRequest request = HttpRequest.newBuilder() // Cria uma requisição e informa o endereço para onde vai
                    .uri(URI.create(endereco)) // Obs: Utiliza o padrão builder, pois é um objeto complexo que precisa ser simplificado, muito usado no Design Pattern
                    .build();
            HttpResponse<String> response = client // É uma interface que obtem uma resposta
                    .send(request, HttpResponse.BodyHandlers.ofString());// send é responsável por obter a resposta
            String json = response.body();

            TituloOmdb meuTituloOmdb = gson.fromJson(json, TituloOmdb.class);

            meuTitulo = new Titulo(meuTituloOmdb);

        } catch (NumberFormatException e) {
            System.out.println("Aconteceu um erro: ");
            System.out.println(e.getMessage());
        } catch (IllegalArgumentException e) {
            System.out.println("Algum erro de argumento na busca, verifique o enderço");
        } catch (ErroDeConversaoDeAnoException e) {
            System.out.println(e.getMessage());
        }
        return meuTitulo;
    }
}

SerializerWriter:

package br.com.alura.screenmatch.modelos;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

public class SerializerWriter {
    public static void objToJson(List<Titulo> titulos) throws IOException {
        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .setPrettyPrinting()
                .create();

        FileWriter escrita = new FileWriter("filmes.json");
        escrita.write(gson.toJson(titulos));
        escrita.close();
    }
}

Divisão nas pastas:

Divisão das pastas

1 resposta
solução!

Oi João, tudo bem?

Seu código está bem estruturado e organizado, com boa separação de responsabilidades. Só alguns pontos rápidos para melhorar: • Feche o Scanner no final (usar try-with-resources ajuda). • Evite escrever o JSON dentro do loop; faça isso só uma vez após todas as buscas. • Prefira tratar as exceções de forma consistente (ou lance ou trate internamente). • Use nomes mais explícitos (ex: url ao invés de endereco). • Considere usar ferramentas para construir URLs de forma segura.

No mais, está muito bom!