Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
2
respuestas

PROBLEMA CON EL DESAFIO (Y VAN)

Sigo con enormes problemas con el desafio y creanme que no es falta de empeño. El problema es que no me larga nada en pantalla y me sube mas de un libro a la base de datos. Paso mi código, gracias package aluracom.example.desafio.principal; import aluracom.example.desafio.model.*; import aluracom.example.desafio.repositorio.Autorrepository; import aluracom.example.desafio.repositorio.Librorepository; import aluracom.example.desafio.servicios.ConsumoAPI; import aluracom.example.desafio.servicios.Conversor;

import java.util.*;

public class Principal { private ConsumoAPI consumo = new ConsumoAPI();

private Conversor conversor = new Conversor();

private Scanner teclado = new Scanner(System.in);

private final String URL_BASE = "https://gutendex.com/books/";

List<Libro> listaLibros = new ArrayList<>();

List<Autor> listaAutores = new ArrayList<>();

private Librorepository librorepositorio;

private Autorrepository autorrepositorio;

public Principal(Librorepository repository, Autorrepository autorrepository) {
    this.librorepositorio = repository;
    this.autorrepositorio = autorrepository;
}


public void MuestraElMenu() {
    var opcion = -1;
    while (opcion != 0) {
        var menu = """
                1. Buscar libros por título
                2. Listar libros registrados
                3. Listar autores registrados
                4. Listar autores vivos en un año
                5. Listar libros por idioma
                """;
        System.out.println(menu);
        opcion = teclado.nextInt();
        teclado.nextLine();

        switch (opcion) {
            case 1:
                mostrarDatosLibro();
                break;
            case 2:
                //mostrarLibrosRegistrador();
                break;
        }
    }

}

private void mostrarDatosLibro() {
    System.out.println("Ingrese el libro que desea buscar");
    var NombreLibro = teclado.nextLine();
    try {
        var json = consumo.obtenerDatos(URL_BASE + "?search=" + NombreLibro.replace(" ", "+"));
        Datos datosBusqueda = conversor.convierteDatos(json, Datos.class);

        if (!listaLibros.isEmpty()) {
            DatosLibro datosLibro = datosBusqueda.libros().get(0); // obtener el primer libro
            Libro libro = new Libro(datosLibro); // convierto a Libro


                for (DatosAutor datosAutor : datosLibro.autores()) {
                    Autor autor = new Autor(datosAutor); // convierto a Autor

                    Optional<Autor> autorExistente = autorrepositorio.findByNombre(autor.getNombre());
                    if (autorExistente.isPresent()) {
                        libro.setAutor(autorExistente.get());
                    } else {
                        autorrepositorio.save(autor);
                        libro.setAutor(autor);
                    }
                    System.out.println("ese es el libro" + libro.toString().trim());

                }

                librorepositorio.save(libro); // guarda el libro en la base de datos
                listaLibros.add(libro); // agrega el libro a la lista local de libros



            }
        } catch(Exception e){
            System.out.println("Error al convertir los libros: " + e.getMessage());
        }
    }
}
2 respuestas
solución!

¡Hola Juan!

Entiendo que estás teniendo problemas con tu desafío y que has estado trabajando arduamente en él. Parece que estás teniendo dificultades para mostrar algo en pantalla y también para subir más de un libro a la base de datos. Después de revisar tu código, parece que el problema puede estar en el método mostrarDatosLibro().

Una posible causa del problema es que la lista de libros listaLibros se está inicializando como una lista vacía al principio de tu clase Principal, pero no estás utilizando esta lista para mostrar los libros o para guardar los libros que se obtienen de la API. Por lo tanto, cada vez que se llama al método mostrarDatosLibro(), se está creando un nuevo ArrayList vacío de libros y no se está mostrando ni guardando nada.

Una posible solución sería utilizar la lista listaLibros que has inicializado al principio de tu clase Principal para almacenar los libros que se obtienen de la API y luego mostrarlos en el menú. De esta manera, podrías evitar subir más de un libro a la base de datos y también mostrar los libros en pantalla.

Aquí tienes un ejemplo de cómo podrías modificar el método mostrarDatosLibro() para utilizar la lista listaLibros:

private void mostrarDatosLibro() {
    System.out.println("Ingrese el libro que desea buscar");
    var NombreLibro = teclado.nextLine();
    try {
        var json = consumo.obtenerDatos(URL_BASE + "?search=" + NombreLibro.replace(" ", "+"));
        Datos datosBusqueda = conversor.convierteDatos(json, Datos.class);

        if (!datosBusqueda.libros().isEmpty()) {
            DatosLibro datosLibro = datosBusqueda.libros().get(0); // obtener el primer libro
            Libro libro = new Libro(datosLibro); // convierto a Libro

            for (DatosAutor datosAutor : datosLibro.autores()) {
                Autor autor = new Autor(datosAutor); // convierto a Autor

                Optional<Autor> autorExistente = autorrepositorio.findByNombre(autor.getNombre());
                if (autorExistente.isPresent()) {
                    libro.setAutor(autorExistente.get());
                } else {
                    autorrepositorio.save(autor);
                    libro.setAutor(autor);
                }
            }

            System.out.println("Este es el libro: " + libro.toString().trim());

            librorepositorio.save(libro); // guarda el libro en la base de datos
            listaLibros.add(libro); // agrega el libro a la lista local de libros
        }
    } catch(Exception e){
        System.out.println("Error al convertir los libros: " + e.getMessage());
    }
}

Espero que esta sugerencia te ayude a avanzar en tu desafío. Si necesitas más ayuda, no dudes en preguntar. ¡Ánimo y sigue adelante!

Espero haber ayudado y buenos estudios!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios!

Hola. Lo hice tal cual y me da error al convertir los libros, que al final pude resolver. Muchas gracias!