Adicao de Funcionario no banco mysql funciona com classe com main mas não funciona chamando por uma servlet rodando em tomcat [RESOLVIDO]

7 respostas
java
T

Tenho um html enviando request para uma servlet que responde com erro porém quando mando rodar uma classe testaAdicionaContato funciona normalmente e adiciona no banco.

tabela do mySQL 5:

create table contatos (
id BIGINT NOT NULL AUTO_INCREMENT,
nome VARCHAR(255),
email VARCHAR(255),
endereco VARCHAR(255),
dataNascimento DATE,
primary key (id)
);

classe TestaAdicionaContato:

package br.com.caelum.servlet;

import java.util.Calendar;

public class TestaAdicionaContato {

    /**
     * @param args
     */
    public static void main(String[] args) {
		// TODO Auto-generated method stub
    	Contato contato = new Contato();
	    contato.setNome("nome");
		contato.setEndereco("endereco");
    	contato.setEmail("email");
	    contato.setDataNascimento(Calendar.getInstance());
	
    	ContatoDAO dao  = new ContatoDAO();
	    dao.adiciona(contato);
    }

}

Servlet AdicionaContato chamada quando preencho o formulário em localhost:8080/agenda/adiciona-contato-html

package br.com.caelum.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/adicionaContato")
@SuppressWarnings("serial")
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");
	    String dataEmTexto = request.getParameter("dataNascimento");
	    Calendar dataNascimento = null;
	
		// fazendo a conversão da data
    	try {
	    	Date date = new SimpleDateFormat("dd/MM/yyyy").parse(dataEmTexto);
		    dataNascimento = Calendar.getInstance();
		    dataNascimento.setTime(date);
		} catch (ParseException e) {
    		out.println("Erro de conversão da data");
	    	return; // para a execução do método
	    }
	
	    // monta um objeto contato
    	Contato contato = new Contato();
		contato.setNome(nome);
	    contato.setEndereco(endereco);
        contato.setEmail(email);
	    contato.setDataNascimento(dataNascimento);
	
    	// salva 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>");
	}
}

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error that prevented it from fulfilling this request.

exception

java.lang.RuntimeException

br.com.caelum.servlet.ConnectionFactory.getConnection(ConnectionFactory.java:13)

br.com.caelum.servlet.ContatoDAO.(ContatoDAO.java:24)

br.com.caelum.servlet.AdicionaContato.service(AdicionaContato.java:49)

javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.41 logs.

Podem me ajudar?

7 Respostas

igomes

O seu main funciona mesmo ? Parece que está estorando algo na sua classe de conexão.

T

Pior que funciona.
Percebi que outras pessoas no mesmo caso que eu descobriram que o problema é que o tomcat não acha o driver do mysql, mas ele está configurado no class path do projeto.
já tirei e coloquei 2 vezes.
alguma dica?

igomes

os seus getParameters estão corretos ?, imprime os parâmetros da view.

T

Como faço para imprimir os parâmetros da view?
de qualquer forma, em uma das tentativas consegui receber a html montada de volta informando que o contato tinha sido salvo , mas fui olhar no mysql e não tinha salvo não.
Nesta hora:
out.println(“Contato " + contato.getNome() + " adicionado com sucesso”);

o getNome() apareceu certo na tela de response “contato salvo” porém como falei antes nada no sql.
imprimir os parâmetros da view seria o que fiz aqui em cima?(no caso só imprimi 1).

igomes

Na hora que vc der o getParameter, colocar um log4j/syso mesmo e ver se todos os parâmetros estão vindo, nome, endereço e blabla, o seu método do dao, retorna alguma coisa ? quando é inserido ou não ? parece que você está tratando as exceptions dentro do próprio método do dao, portando aparecer contato.getNome = “Joao”, não quer dizer que inseriu, vc simplesmente preencheu o seu objeto.

Raphatelatim

Tive um problema parecido quando estava estudando a apostila da Caelum, se não me engano era algo com o web.xml.

Poste-o aqui para vermos.

T

Boa noite.
Desculpe a demora.
Eu estava usando o eclipse indigo com java 7.
detonei tudo, instalei o eclipse mars.2 com java 8 e o mesmo código rodou e inseriu no banco normalmente.
Gostaria de agradecer a atenção.
Obrigado

Criado 1 de março de 2016
Ultima resposta 4 de mar. de 2016
Respostas 7
Participantes 3