Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
3
respuestas

tengo(también) un error en la linea 1 del ProductoController

Hola , no me deja contruir el proyecto y me da este error en la líena 1 de ProductoController

Errors occurred during the build. Errors running builder 'Java Builder' on project 'control-de-stock'. class org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding cannot be cast to class org.eclipse.jdt.internal.compiler.lookup.VariableBinding (org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding and org.eclipse.jdt.internal.compiler.lookup.VariableBinding are in unnamed module of loader org.eclipse.osgi.internal.loader.EquinoxClassLoader @308e1a45)

Adjunto código:

package com.alura.jdbc.controller;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alura.jdbc.factory.ConnectionFactory;

public class ProductoController {

    public int modificar(String nombre, String descripcion, Integer cantidad, Integer id) throws SQLException {
        final Connection con = new ConnectionFactory().recuperaConexion();
        
        try(con){
            final PreparedStatement statement = con.prepareStatement("UPDATE PRODUCTO SET "
                    + "NOMBRE = ?"
                    + ", DESCRIPCION = ?"
                    + ", CANTIDAD = ?"
                    + " WHERE ID = ?");
            
            try(statement){
                statement.setString(1, nombre);
                statement.setString(2, descripcion);
                statement.setInt(3, cantidad);
                statement.setInt(4, id);
                
                statement.execute();
            
                int updateCount = statement.getUpdateCount();

                return updateCount;					
            }
        }
    }

    public int eliminar(Integer id) throws SQLException {
        final Connection con = new ConnectionFactory().recuperaConexion();
        
        try(con){
            final PreparedStatement statement = con.prepareStatement("DELETE FROM PRODUCTO WHERE ID = ?");
            
            try(statement){
                statement.setInt(1, id);
                
                statement.execute();

                int updateCount = statement.getUpdateCount();

                return updateCount;					
            }
        }
    }

    public List<Map<String,String>> listar() throws SQLException {
        final Connection con = new ConnectionFactory().recuperaConexion();
        
        try(con){
            final PreparedStatement statement = con.prepareStatement("SELECT ID, NOMBRE, DESCRIPCION, CANTIDAD FROM PRODUCTO");
            
            try(statement){
                statement.execute();
                
                ResultSet resultSet = statement.getResultSet();
                
                List<Map<String,String>> resultado = new ArrayList<>();
                
                while (resultSet.next()) {
                    Map<String,String> fila = new HashMap<>();
                    fila.put("ID", String.valueOf(resultSet.getInt("ID")));
                    fila.put("NOMBRE", resultSet.getString("NOMBRE"));
                    fila.put("DESCRIPCION", resultSet.getString("DESCRIPCION"));
                    fila.put("CANTIDAD", String.valueOf(resultSet.getInt("CANTIDAD")));
                    
                    resultado.add(fila);
                }
                return resultado;
            }
        }
    }

    public void guardar(Map<String, String> producto) throws SQLException {
        String nombre = producto.get("NOMBRE");
        String descripcion = producto.get("DESCRIPCION");
        Integer cantidad = Integer.valueOf(producto.get("CANTIDAD"));
        Integer maximoCantidad = 50;
        
        final Connection con = new ConnectionFactory().recuperaConexion();
        
        try(con){
            con.setAutoCommit(false);
            
            final PreparedStatement statement = con.prepareStatement("INSERT INTO PRODUCTO"
                    + "(nombre, descripcion, cantidad)"
                    + "VALUES (?,?,?)"
                    , Statement.RETURN_GENERATED_KEYS);
            
            try(statement){
                do {
                    int cantidadParaGuardar = Math.min(cantidad, maximoCantidad);
                    
                    ejecutaRegistro(nombre, descripcion, cantidadParaGuardar, statement);
                    
                    cantidad -= maximoCantidad;
                }while(cantidad > 0);
                
                con.commit();	
                System.out.println("COMMIT");
            }catch(Exception e) {
                con.rollback();
                System.out.println("ROLLBACK");
            }
        }
    }

    private void ejecutaRegistro(String nombre, String descripcion, Integer cantidad, PreparedStatement statement)
            throws SQLException {
        statement.setString(1, nombre);
        statement.setString(2, descripcion);
        statement.setInt(3, cantidad);
        
        statement.execute(); 
        
        final ResultSet resultSet = statement.getGeneratedKeys();
        
        try(ResultSet){
            while (resultSet.next()) {
                System.out.println(
                        String.format(
                                "Fue insertado el producto ID %d",
                                resultSet.getInt(1)));
            }
        }
    }

}

Gracias por la ayuda:

![](Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad )

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

3 respuestas

¡Hola Sebastian, espero que estés bien!

¿Podría mostrarme más detalles del error, como la consola entera?

Entiendo que estás teniendo un problema con el error en la línea 1 de ProductoController. El error que estás viendo parece estar relacionado con un problema de casting en el proyecto. Parece que estás intentando convertir un BinaryTypeBinding a un VariableBinding, lo cual no es posible y está generando el error que estás viendo.

Dado que el error parece estar relacionado con la configuración del proyecto y la forma en que se están manejando los recursos, te recomendaría revisar la implementación del Try With Resources en tu código. El Try With Resources te permite declarar y utilizar recursos que implementan la interfaz AutoCloseable de una manera más segura, ya que se encarga automáticamente de cerrar los recursos al finalizar el bloque de try.

En tu código, parece que estás utilizando el Try With Resources en algunos lugares, pero es posible que no se esté aplicando de manera correcta en todos los casos. Te recomendaría revisar la implementación del Try With Resources en tu código, asegurándote de utilizarlo de manera adecuada en todos los lugares donde se manejan recursos como conexiones, statements y result sets.

Espero que esta sugerencia te ayude a resolver el problema que estás experimentando. Si necesitas más ayuda con la implementación del Try With Resources o con cualquier otro aspecto de tu proyecto, no dudes en preguntar.

¡Espero haber ayudado y buenos estudios!

Hola, gracias por la respuesta y después de revisar las sentecias "try" puedo verificar que es el mismo código que expone el relator en el curso y puedo concluir que no hay ninguna respuesta satisfactoria para poder solucionar este "bug".

Podría darse la posibilidad que el código del curso está caduco y es imposible impementar lo que propone el relator en el curso, si es así debo informar a mis superiores que imposible completar mi Plan de Estudios.

![](Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad )

Errors occurred during the build.
Errors running builder 'Java Builder' on project 'control-de-stock'.
class org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding cannot be cast to class org.eclipse.jdt.internal.compiler.lookup.VariableBinding (org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding and org.eclipse.jdt.internal.compiler.lookup.VariableBinding are in unnamed module of loader org.eclipse.osgi.internal.loader.EquinoxClassLoader @2af6e298)

Estuve revisando la documentación en https://www.baeldung.com/java-try-with-resources y allí se dice la definicial del resultSet deb ser dentro de losparentesis del try

y sólo hay que reemplazar

//		final ResultSet resultSet = statement.getGeneratedKeys();
//		try(resultSet){
        
        try(final ResultSet resultSet = statement.getGeneratedKeys()){ 

Saludos cordiales