Erro ao inserir registro no banco de dados com servlet

26 respostas
java
M

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?

26 Respostas

V

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

M

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

V

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

B

o que chega nessa linha??

M
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);
M

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…

V

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

D

O que tem na linha 21 da classe ContatoDAO?

M

PreparedStatement ps = con.prepareStatement(sql);

M

tentei com set e nao funcionou…

V

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

M

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

V
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();
M

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

D

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?

M

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;			
	}
}

}

D

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();

L

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).

M

é 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?

D

No suitable driver found se refere a um problema com a construção da URL de conexão (essa aí de cima).
Caso o driver não estivesse no classpath, você teria outro erro, provavelmente, um ClassNotFoundException.
Copia e cola o código da classe, para vermos.

M

estranho…porque quando eu faço um test com junit ele conecta mas pelo tomcat ele nao consegue conectar?

M

tem algum adicional pra criar a conexao quando o projeto é web?

D

Cara, como eu disse, você precisa mudar aquela linha, senão nunca vai saber qual é o erro.
Provavelmente, seja algum problema ao empacotar o jar ou encontrar a classe do driver. Mas, só com uma mensagem adequada de exceção é que podemos saber.

F

Ja tive esse mesmo problema com mysql, o dao funcionava a menos que eu recebesse um request http, resolvi colocando essa linha antes de instaciar o driver na classe de conexao.

Class.forName(“com.mysql.jdbc.Driver”);

pode ser o mesmo erro ai, nao conseguir achar o motivo, essa linha so deveria ser necessaria no jdbc 3, mas funcionou.

F

Outra coisa, acho que é melhor vc tirar o seu “return con” de dentro do try, e colocar no fim do metodo e também tirar o retorno null do catch e deixar só a exception

M

Adicionei a seguinte linha de codigo e funcionou
Class.forName(“org.postgresql.Driver”);
Obrigado

Criado 8 de março de 2018
Ultima resposta 8 de mar. de 2018
Respostas 26
Participantes 6