Erro ao inserir registro no banco de dados com servlet

Estou estudando java para web, servlet etc.
estou com um projeto aqui, criei minha conexao com o banco de dados, meu dao, minha pagina html e meu servlet, o meu dao funciona normalmente (teste com junit, e ele inseriu no banco de dados) porém quando eu rodo a aplicação no tomcat ele da o seguinte erro:

java.lang.NullPointerException
dao.ContatoDAO.inserirContato(ContatoDAO.java:21)
servlet.AdicionaContato.service(AdicionaContato.java:35)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

o que pode ser?

Classe ContatoDAO:
package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import data.Conexao;
import model.Contato;

public class ContatoDAO {

Connection con;

public ContatoDAO(){
	con = new Conexao().getConnection();
}

public void inserirContato(Contato contato) {
	String sql = "INSERT INTO tbl_contato(nome, endereco, email)VALUES (?, ?, ?);";
	try {
		PreparedStatement ps = con.prepareStatement(sql);
		ps.setString(1, contato.getNome());
		ps.setString(2, contato.getEmail());
		ps.setString(3, contato.getEndereco());
		ps.execute();
	} catch (SQLException e) {
		throw new IllegalAccessError("erro inserir: " + e.getMessage());
	}
}

}

Classe AdicionaContato:

package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.ContatoDAO;
import model.Contato;

@WebServlet("/adicionaContato")
public class AdicionaContato extends HttpServlet {
protected void service(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
// busca o writer
PrintWriter out = response.getWriter();

    // buscando os parâmetros no request
    String nome = request.getParameter("nome");
    String endereco = request.getParameter("endereco");
    String email = request.getParameter("email");


    // monta um objeto contato
    Contato contato = new Contato(nome, endereco, email);

    // salva o contato
    ContatoDAO dao = new ContatoDAO();
    dao.inserirContato(contato);

    // imprime o nome do contato que foi adicionado
    out.println("<html>");
    out.println("<body>");
    out.println("Contato " + contato.getNome() +
            " adicionado com sucesso");
    out.println("</body>");
    out.println("</html>");
}

}

alguem consegue me ajudar?

Pode ser que não seja isso, mas deveria ter um espaço entre o “)” e o “Values”.

meu dao funciona…mas mesmo assim coloquei o espaço e o erro persiste

Tenta imprimir os valores do Objeto, porque parece que o objeto não esta sendo setado.

o que chega nessa linha??

O que eu pego da pagina html de input
String nome = request.getParameter(“nome”);
seto os valores em uma variavel
Contato contato = new Contato(nome, endereco, email);
e passo ela pro dao
dao.inserirContato(contato);

eles estão vindo nulo, só nao sei o porque ainda…
porém se eu dou o comando
System.out.println("nome: " + request.getParameter(“nome”));
ele printa no consolo da ide…

Cria get and set, provavelmente não esta conseguindo passar os valores pelo construtor.

O que tem na linha 21 da classe ContatoDAO?

PreparedStatement ps = con.prepareStatement(sql);

tentei com set e nao funcionou…

As Strings não estão retornando nulo não ne?

eu preencho elas na pagina html
eu até dei system.out.println no console pra ver como elas estavam chegando até eu chamado o metodo inserir do dao, e elas vem com conteudo
quando chega nessa linha
dao.inserirContato(contato);
da ruim

Se as Strings não estão nulas verifique agora o objeto, antes de passar para o método.
contato.getNome();
contato.getEndereco();
contato.getEmail();

esta saindo os valores…o problema continua pra passar pro dao

Por alguma razão, o objeto con está nulo.
Vi, no código que mostrou, que ele é instanciado no construtor, certo?

Não é isso?

Se for, como está o método getConnection da classe Conexao?

1 curtida

isso mesmo…
Codigo da classe de conexao

package data;

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

public class Conexao {

private Connection con;

public Connection getConnection(){
	final String url = "jdbc:postgresql://localhost:5432/Servlet";
	final String user = "postgres";
	final String password = "senha";
	try {
		con = DriverManager.getConnection(url, user, password);
		return con;
		
	} catch (SQLException e) {
		e.getMessage();
		return null;			
	}
}

}

Por alguma razão, está caindo no catch.
O problema é que você está ocultando a exceção

O ideal seria ter algum tipo de log. Se não quiser, pode trocar esse e.getMessage() por e.printStackTrace();

Me parece que o objeto ‘con’ que guarda a referência da conexão com o banco de dados está nulo. Verifique se a classe Conexao está criando e obtendo a conexão com o banco corretamente.
Verifique também se o jdbc driver do seu banco está no classpath da aplicação web. Aproveitando, veja também se os parâmetros de conexão com banco estão corretos(usuário, URL, senha, nome do Driver).

1 curtida

é esse o problema, no driver de conexao
No suitable driver found for jdbc:postgresql://localhost:5432/Servlet
porém eu adicionei o driver no build path…tem mais alguma lugar que é necessario eu colocar?