[Resolvido] Encontrar o erro no exercício 5.11 apostila fj21 Caelum

8 respostas
M

Olá gente, estou estudando Java Web pela apostila da Caelum e no exercício 5.11 (Formulário) acabei parando por um erro.

java.lang.NullPointerException
dao.ContatoDao.adiciona(ContatoDao.java:22)
servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:53)

Já percebi que o erro é ao adicionar ao banco, mas não sei o que está errado pois testei o código ponta a ponta e ele funcionou. Quando inseri a Servlet foi que o erro apareceu.

FORMULÁRIO

<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title>Formulário</title>
</head>

<body>
	<h1> Adiciona Contatos </h1>
	
	<form action="adicionaContato">
		Nome: <input type="text" name="nome"/><br/>
		E-mail: <input type="email" name="email"/> <br/>
		Endereço: <input type="text" name="endereco"/><br/>
		Data de Nascimento: <input type="text" name="dataNascimento"/><br/><br/>
		
		<input type="submit" value="Gravar">
	</form>
</body>

</html>

CONNECTIONFACTORY

public class ConnectionFactory {
	public Connection createConnection() {
		Connection conexao = null;
		
		try {
			conexao = DriverManager.getConnection("jdbc:mysql://localhost:3306/fj21", "root", "root");
		} catch(SQLException e) {
			e.printStackTrace();
		}
		
		return conexao;
	}
}

CONTATO

public class Contato {
	private Long id;
	private String nome;
	private String email;
	private String endereco;
	private Calendar dataNascimento;
	
	public Long getId() {
		return id;
	}
	
	public void setId(Long id) {
		this.id = id;
	}
	
	public String getNome() {
		return nome;
	}
	
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public String getEmail() {
		return email;
	}
	
	public void setEmail(String email) {
		this.email = email;
	}
	
	public String getEndereco() {
		return endereco;
	}
	
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	
	public Calendar getDataNascimento() {
		return dataNascimento;
	}
	
	public void setDataNascimento(Calendar dataNascimento) {
		this.dataNascimento = dataNascimento;
	}
}

CONTATODAO

public class ContatoDao {
	private Connection conexao;
	
	public ContatoDao() {
		this.conexao = new ConnectionFactory().createConnection();
	}
    
	// Método para adicionar
	public void adiciona(Contato contato){
		String sql = "INSERT INTO contato(nome, email, endereco, dataNascimento) VALUES(?,?,?,?)";
		
		try {
			//Prepara Statement
			PreparedStatement stmt = conexao.prepareStatement(sql);
			
			//Setar valores
			stmt.setString(1, contato.getNome());
			stmt.setString(2, contato.getEmail());
			stmt.setString(3, contato.getEndereco());
			stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
			
			//Executa
			stmt.execute();
			stmt.close();
		} catch(SQLException e) {
			e.printStackTrace();
		}
	}
}

SERVLET

@WebServlet("/adicionaContato")
public class AdicionaContatoServlet extends HttpServlet {
	
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		
		// Buscar parametros no request
		String nome = request.getParameter("nome");
		String email = request.getParameter("email");
		String endereco = request.getParameter("endereco");
		String dataEmTexto = request.getParameter("dataNascimento");
		Calendar dataNascimento = null;
		
		// Conversão da data
		try {
			Date date = new SimpleDateFormat("dd/MM/yyyy").parse(dataEmTexto);
			dataNascimento = Calendar.getInstance();
			dataNascimento.setTime(date);
		} catch(java.text.ParseException e) {
			out.println("Erro de conversão.");
			return; //para a execução do método.
		}
		
		//Monta objeto contato
		Contato contato = new Contato();
		contato.setNome(nome);
		contato.setEmail(email);
		contato.setEndereco(endereco);
		contato.setDataNascimento(dataNascimento);
		
		//Salvar o contato
		ContatoDao dao = new ContatoDao();
		dao.adiciona(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>");
	}
}

Se alguém puder me ajudar, eu agradeço.

8 Respostas

Y

Cara, tô empacado na mesma parte, só que o meu dá erro no .parse(dataEmTexto), e até agora não consegui arrumar outra forma de correção.

Já no seu contatoDao, muda o this.conexao = new ConnectionFactory().createConnection() para this.conexao = new ConnectionFactory().getConnection();
No meu está com get e funciona normalmente, o meu problema mesmo é o parse da Data.

Espero que ajude.
Flw

M

No caso, na minha conexão o método chama-se create… descobri q o meu problema está na versão do mysql, no caso, ele não consegue conectar ao drive jdbc… tô tentando corrigir.

L

O que tem na linha 22 da classe ContatoDao?

M

Era o estanciamento da classe.

M

Após passar o dia todo pesquisando em fóruns, descobri q falta uma linha lá no código… minha ConnectionFactory, ficou assim no try:

try{

//Essa primeira linha q fez a diferença	

DriverManager.registerDriver(new com.mysql.jdbc.Driver());

conexao = DriverManager.getConnection(jdbc:mysql://localhost:3306/fj21”, “root”, “root”);

return conexao;

}catch(SQLException e){

e.printStackTrace();

throw e;
}
Y

Olha o meu:

try{

return DriverManager.getConnection(

jdbc:mysql://localhost/fj21,root, “”);

}catch (SQLException e){

throw new RuntimeException(e);

Estranho, pq a minha não tem essa linha e roda de boa, o problema mesmo está na conversão de data.

Falando nisso, o seu tá fazendo o formato certo da data?

M

Sim, tá armazenando a data certinho, sem problemas. A pergunta é: o seu parou de funcionar quando colocou a Servlet? quando estava local, funcionava armazenando sem problemas? se foi, tenta colocar essa linha ai q te passei… Na realidade eu fiz um tratamento e fui jogando o erro para ser exibido num try/catch lá no resultado da servlet… e foi ai q descobri q o problema estava que o jdbc não estava funcionando, apesar de localmente aparentemente ele está.

G

Pessoal estava tendo este problema de funcionar localmente mais na web dando erro, então coloquei o mysql-connector dentro de webContent/web-inf/lib e tudo certo agora.

Criado 23 de maio de 2016
Ultima resposta 7 de jul. de 2016
Respostas 8
Participantes 4