1

*Hola, espero puedan ayudarme con un problema:

Estoy intentando hacer un insert por medio de jdbc, usando eclipse, con java, MySQL y uso de Servlets. Al hacer la prueba de conexión me envía que se ha conectado

Alejecutar el proyecto, corre sin problema, pero al llenar un formulario ej JSP es cuando me manda la Excepción: *

java.lang.NullPointerException
    at net.hector.dao.VacanteDao.insert(VacanteDao.java:21)
    at net.hector.controller.VacanteController.doPost(VacanteController.java:34)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

* El error lo manda en esta clase, en la línea del preparedStatement: "PreparedStatement ps = conn.getConnection().prepareStatement(sql);" *

    package net.gogo.dao;

    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.text.SimpleDateFormat;

    import net.gogo.model.Vacante;

    public class VacanteDao {
        DBConection conn;


        public VacanteDao(DBConection conn) {
            this.conn = conn;
        }

        public boolean insert(Vacante vacante) {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            String sql = "insert into Vacante values (?,?,?,?,?)";
            try {
                PreparedStatement ps = conn.getConnection().prepareStatement(sql);
                ps.setInt(1, vacante.getIdVacante());
                ps.setString(2, format.format(vacante.getFechaPublicacion()));
                ps.setString(3, vacante.getNombreVacante());
                ps.setString(4, vacante.getDescripcionVacante());
                ps.setString(5, vacante.getDetalleVacante());
                ps.executeUpdate();

                return true;
            } catch(SQLException e) {
                return false;
            }
        }
    }

*
Agrego el código de la conexión:
*

package net.gogo.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConection {
    static String tz = "?useTimezone=true&serverTimezone=UTC";
    static String driver = "com.mysql.cj.jdbc.Driver";
    static String user = "root";
    static String pass = "1234";
    static String bd = "sistemadb";
    static String url = "jdbc:mysql://localhost/" + bd + tz; 

    Connection conn = null;

    public DBConection() {
        try {
            Class.forName(driver);

            conn = DriverManager.getConnection(url, user, pass);

            if(conn != null) {
                System.out.println("Conectando a la Base de datos [" + conn + "] Ok");
            }
        } catch(SQLException e) {
            System.out.println("Excepción de conexión: " + e.getMessage());
        } catch (ClassNotFoundException e) {
            System.out.println("Excepción de Controlador: " + e.getMessage());
        }
    }

    public Connection getConnection() {
        return conn;
    }

    public void cerrarConexion() {
        System.out.println("Cerrando conexión: [" + conn + "] Ok");
        if(conn != null) {
            try {
                conn.close();
            } catch(SQLException e) {
                System.out.println(e);
            }
        }
    }
}

* Y el del Servlet que uso como controlador: *

package net.gogo.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.gogo.dao.DBConection;
import net.gogo.dao.VacanteDao;
import net.gogo.model.Vacante;

public class VacanteController extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String nombreParam = req.getParameter("nombre");
        String descripcionParam = req.getParameter("descripcion");
        String detalleParam = req.getParameter("detalle");

        Vacante vacante = new Vacante(0);
        vacante.setNombreVacante(nombreParam);
        vacante.setDescripcionVacante(descripcionParam);
        vacante.setDetalleVacante(detalleParam);

        System.out.println(vacante);

        DBConection conn = new DBConection();
        VacanteDao vDao = new VacanteDao(conn);
        boolean estatus = vDao.insert(vacante);

        String msg = "";
        if(estatus) {
            msg = "La vacante fue guardada correctamente";
        } else {
            msg = "Ocurrió un error. La vacante no fue guardada";
        }
        conn.cerrarConexion();

        RequestDispatcher rd;
        req.setAttribute("message", msg);

        rd = req.getRequestDispatcher("/mensaje.jsp");
        rd.forward(req, resp);

    }
}

* El código del Bean *

package net.gogo.model;

import java.util.Date;

public class Vacante {
    private int idVacante;
    private Date fechaPublicacion;
    private String nombreVacante;
    private String descripcionVacante;
    private String detalleVacante;

    public Vacante(int idVacante) {
        this.fechaPublicacion = new Date();
        this.idVacante = idVacante;
    }

    public int getIdVacante() {
        return idVacante;
    }

    public void setIdVacante(int idVacante) {
        this.idVacante = idVacante;
    }

    public Date getFechaPublicacion() {
        return fechaPublicacion;
    }

    public void setFechaPublicacion(Date fechaPublicacion) {
        this.fechaPublicacion = fechaPublicacion;
    }

    public String getNombreVacante() {
        return nombreVacante;
    }

    public void setNombreVacante(String nombreVacante) {
        this.nombreVacante = nombreVacante;
    }

    public String getDescripcionVacante() {
        return descripcionVacante;
    }

    public void setDescripcionVacante(String descripcionVacante) {
        this.descripcionVacante = descripcionVacante;
    }

    public String getDetalleVacante() {
        return detalleVacante;
    }

    public void setDetalleVacante(String detalleVacante) {
        this.detalleVacante = detalleVacante;
    }

    @Override
    public String toString() {
        return "Vacante [idVacante=" + idVacante + ", fechaPublicacion=" + fechaPublicacion + ", nombreVacante="
                + nombreVacante + ", descripcionVacante=" + descripcionVacante + ", detalleVacante=" + detalleVacante
                + "]";
    }
}

* Y el nombre y los campos de la base de datos: *

Nombre de las tablas

Nombre de los campos

Lorena
  • 63
  • 9

3 Answers3

0

El problema es que tu variable conn, en la clase DBConnection, nunca se inicializa. De acuerdo con el código que proporcionas, el constructor en DBConnection debe estar lanzando algún error en estas línea

Class.forName(driver);

conn = DriverManager.getConnection(url, user, pass);

Revisa los logs del servidor que estés usando, posiblemente ahí lo puedas encontrar. Algo que puedes intentar es combinar las cláusulas catch del constructor en cuestión, de modo que captures la superclase Exception

    try {
        Class.forName(driver);

        conn = DriverManager.getConnection(url, user, pass);

        if(conn != null) {
            System.out.println("Conectando a la Base de datos [" + conn + "] Ok");
        }
    } catch(Exception e) {
        System.out.println("Excepción de conexión: " + e.getMessage());
    }
RenoMx
  • 11
  • 1
  • Gracias por responder, efectivamente, en la línea del Class.forName(driver); se detiene y en seguida brinca al Exception. En el log me dice lo mismo que comento en el primer código, y ya he cambiado la cáusula catch como me comentas. ¿En dónde debo inicializar la variable conn? ¡Gracias! – Lorena Jul 31 '19 at 19:09
  • Vale, ahora sería mejor que abrieras otra pregunta. Si te lanza un error en `Class.forName(driver);` significa que la clase no se está resolviendo correctamente. Comprueba que el classpath de tu proyecto resuelva correctamente la biblioteca que contiene la clase del driver; esto ya va a depender de una serie de factores (IDE, servidor WEB, entorno de despliegue, etc) – RenoMx Aug 02 '19 at 13:40
0

Colocar en la url de conexión a la BDD.

jdbc:mysql://localhost:3306/practicas?useTimeZone=true&serverTimezone=UTC&autoReconnect=true&useSSL=false

Carlos
  • 1,787
  • 4
  • 12
0

Te faltó el puerto por el que escucha MySql, que por defecto es el 3306, revisa en tu gestor, tu conexión a ver si no lo haz cambiado, de ser así pon el que tengas asignado por defecto.

Debería ser así

static String url = "jdbc:mysql://localhost:3306/" + bd + tz;