Dúvida na Apostila Caelum FJ-21[RESOLVIDO]

O erro:

[quote]type Exception report

message

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

exception

org.apache.jasper.JasperException: An exception occurred processing JSP page /lista-contato-elegante.jsp at line 8

5: <jsp:useBean id=“dao” class=“br.com.caelum.dao.ContatoDAO” />
6:


7:
8: <c:forEach var=“contato” items="${dao.lista}">
9:
10:
11:

Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:521)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:430)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

org.apache.jasper.el.JspELException: /lista-contato-elegante.jsp(8,2) ‘${dao.lista}’ Error reading ‘lista’ on type br.com.caelum.dao.ContatoDAO
org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:107)
org.apache.jsp.lista_002dcontato_002delegante_jsp._jspx_meth_c_005fforEach_005f0(lista_002dcontato_002delegante_jsp.java:104)
org.apache.jsp.lista_002dcontato_002delegante_jsp._jspService(lista_002dcontato_002delegante_jsp.java:74)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

java.lang.NullPointerException
br.com.caelum.dao.ContatoDAO.getLista(ContatoDAO.java:42)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
javax.el.BeanELResolver.getValue(BeanELResolver.java:83)
javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
org.apache.el.parser.AstValue.getValue(AstValue.java:123)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101)
org.apache.jsp.lista_002dcontato_002delegante_jsp._jspx_meth_c_005fforEach_005f0(lista_002dcontato_002delegante_jsp.java:104)
org.apache.jsp.lista_002dcontato_002delegante_jsp._jspService(lista_002dcontato_002delegante_jsp.java:74)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.33 logs.
[/quote]

lista-contato-elegante.jsp

[code]<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>

${contato.nome} ${contato.email}
${contato.nome} ${contato.email} ${contato.endereco}
[/code]

ContatoDAO.java

[code]package br.com.caelum.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import br.com.caelum.jdbc.ConnectionFactory;

public class ContatoDAO {
private Connection connection;

public ContatoDAO() {
	new ConnectionFactory().getConnection();
}

public void adiciona(Contato contato) throws SQLException {
	ConnectionFactory c = new ConnectionFactory();
	Connection conn = c.getConnection();
	Statement s = conn.createStatement();
	s.executeQuery("use FJ21;");
	s.executeQuery("insert into contatos (nome,email,endereco,dataNascimento) values ("
			+ contato.getNome()
			+ ", "
			+ contato.getEmail()
			+ ", "
			+ contato.getEndereco()
			+ ", "
			+ new Date(contato.getDataNascimento().getTimeInMillis())
			+ ");");
}

public List<Contato> getLista() {
	try {
		List<Contato> contatos = new ArrayList<Contato>();
		PreparedStatement stmt = connection
				.prepareStatement("select * from contatos");
		ResultSet rs = stmt.executeQuery();

		while (rs.next()) {
			// criando o objeto Contato
			Contato contato = new Contato();
			contato.setId(rs.getLong("id"));
			contato.setNome(rs.getString("nome"));
			contato.setEmail(rs.getString("email"));
			contato.setEndereco(rs.getString("endereco"));

			// montando a data através do Calendar
			Calendar data = Calendar.getInstance();
			data.setTime(rs.getDate("dataNascimento"));
			contato.setDataNascimento(data);

			// adicionando o objeto à lista
			contatos.add(contato);
		}
		rs.close();
		stmt.close();
		return contatos;
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

}[/code]

Acho que dentro do método getLista() faltou instanciar o objeto connection …

[]'s

[quote=alex.brito]Acho que dentro do método getLista() faltou instanciar o objeto connection …

[]'s[/quote]

Ele não está deixando eu instancia-lo.

Ele fala: “Cannot instantiate the type Connection”.

Seu método adciona funciona ? Tenta obter a conexão igual ao método adiciona (ConnectionFactory).

Uma observação:

no seu construtor ContatoDAO() acho que deveria ficar assim:

 public ContatoDAO() {  
      connection =  new ConnectionFactory().getConnection();  
 } 

Tenta ai …

[]'s

Testa o esquema do construtor primeiro, assim, você não precisaria criar um novo objeto connection no getLista …

Aeee agora sim funcionou. Arrumei lá o construtor e deu certo. Obrigado pela ajuda.

Opa, beleza então …

Bom, o pessoal aqui do forum aconselha a colocar um " [RESOLVIDO] " no título do tópico quando você encontra uma solução satisfatória, fica aqui a sugestão.

Boa sorte nos estudos …

[]'s