Erro ao acessar lista-contatos-elegante FJ-21 (exemplo da apostila) [RESOLVIDO]

Tenho estudado pela apostila da caelum, onde estou começando com o desenvolvimento web…
E estou acessando uma pagina jsp… mas nao estou conseguindo… se alguem pude me ajudar…

ContatoDAO


package br.com.caelum.agenda.dao;

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

import br.com.caelum.agenda.factory.ConnectionFactory;
import br.com.caelum.agenda.model.Contato;

public class ContatoDAO {
        private Connection connection;
        private DAOException exception;

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

        public void adiciona(Contato contato) {
                String sql = "INSERT INTO contatos (nome,email,endereco,dataNascimento) VALUES (?,?,?,?)";
                try {
                        PreparedStatement stmt = this.connection.prepareStatement(sql);
                        stmt.setString(1, contato.getNome());
                        stmt.setString(2, contato.getEmail());
                        stmt.setString(3, contato.getEndereco());
                        stmt.setDate(4, new Date(contato.getDataNascimento()
                                        .getTimeInMillis()));
                        stmt.execute();
                        stmt.close();
                } catch (SQLException e) {
                        this.exception.getException(e);
                }
        }

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

                        while (rs.next()) {
                                // Criando o objeto de 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"));

                                Calendar data = Calendar.getInstance();
                                data.setTime(rs.getDate("datanascimento"));
                                contato.setDataNascimento(data);

                                // Adiciona o contato a lista
                                contatos.add(contato);
                        }
                        rs.close();
                        stmt.close();
                } catch (SQLException e) {
                        this.exception.getException(e);
                }
                return contatos;
        }

        public void altera(Contato contato) {
                String sql = "UPDATE contatos SET " + "nome = ?," + "email = ?,"
                                + "endereco = ?," + "datanascimento = ?" + "WHERE id = ?";
                try {
                        PreparedStatement stmt = this.connection.prepareStatement(sql);
                        stmt.setString(1, contato.getNome());
                        stmt.setString(2, contato.getEmail());
                        stmt.setString(3, contato.getEndereco());
                        stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
                        stmt.setLong(5, contato.getId());
                        stmt.execute();
                        stmt.close();
                } catch (SQLException e) {
                        this.exception.getException(e);
                }
        }

        public void remove(Contato contato) {
                try {
                        PreparedStatement stmt = connection.prepareStatement("delete from contatos where id=?");
                        stmt.setLong(1, contato.getId());
                        stmt.execute();
                        stmt.close();
                } catch (SQLException e) {
                        this.exception.getException(e);
                }
        }
}

Factory


package br.com.caelum.agenda.factory;

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

public class ConnectionFactory {
	
	public Connection getConnection() {
		try {
			 System.out.println("Connect to database...");  
			return DriverManager.getConnection("jdbc:mysql://localhost:3306/fj21", "root", "root");
		} catch (SQLException e) {
			throw new RuntimeException();
		}
	}

}

lista-contatos-elegante.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
	<!-- Cria a lista -->
	<jsp:useBean id="dao" class="br.com.caelum.agenda.dao.ContatoDAO"></jsp:useBean>
	<table>
		<!-- for -->
			<c:forEach var="contato" items="${dao.lista}">
				<tr>
					<td>${contato.nome}</td>
					<td>${contato.email}</td>
					<td>${contato.endereco}</td>
					<td>${contato.dataNascimento}</td>
				</tr>
			</c:forEach>	
	</table>
</body>
</html>

segue um print da estrutura do projeto como esta:
http://img502.imageshack.us/i/estruturaprojeto.jpg/

o JAR encontra-se em:
fj21-agenda\WebContent\WEB-INF\lib

o do MySQL:
…\apache-tomcat-6.0.29\lib

O erro que resulta no console:

08/01/2011 19:46:50 org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre6\bin;.;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files (x86)\MiKTeX 2.9\miktex\bin;C:\Program Files (x86)\CollabNet\Subversion Client;C:\Program Files (x86)\Embarcadero\RAD Studio\8.0\bin;C:\Users\Public\Documents\RAD Studio\8.0\Bpl;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Dell\DW WLAN Card\Driver;c:\Program Files\WIDCOMM\Bluetooth Software\;c:\Program Files\WIDCOMM\Bluetooth Software\syswow64;C:\Program Files (x86)\Common Files\Roxio Shared\DLLShared\;C:\Program Files (x86)\Common Files\Roxio Shared\10.0\DLLShared\;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\;c:\Program Files (x86)\Microsoft SQL Server\100\DTS\Binn\;c:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Program Files\Java\jdk1.6.0_22\bin;C:\Program Files\MySQL\MySQL Server 5.5\bin
08/01/2011 19:46:50 org.apache.tomcat.util.digester.SetPropertiesRule begin
AVISO: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:fj21-agenda' did not find a matching property.
08/01/2011 19:46:50 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
08/01/2011 19:46:50 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 528 ms
08/01/2011 19:46:50 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
08/01/2011 19:46:50 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.29
08/01/2011 19:46:51 org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor host-manager.xml
08/01/2011 19:46:51 org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor manager.xml
08/01/2011 19:46:51 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory docs
08/01/2011 19:46:51 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory examples
08/01/2011 19:46:51 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
08/01/2011 19:46:51 org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()
08/01/2011 19:46:51 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory ROOT
08/01/2011 19:46:51 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
08/01/2011 19:46:51 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
08/01/2011 19:46:51 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/30  config=null
08/01/2011 19:46:51 org.apache.catalina.startup.Catalina start
INFO: Server startup in 747 ms
08/01/2011 19:47:00 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet jsp threw exception
java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.LoopTag
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491)
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClassCond(Unknown Source)
	at java.lang.ClassLoader.defineClass(Unknown Source)
	at java.security.SecureClassLoader.defineClass(Unknown Source)
	at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2733)
	at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1124)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1612)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491)
	at org.apache.jasper.compiler.Parser.parseCustomTag(Parser.java:1194)
	at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1421)
	at org.apache.jasper.compiler.Parser.parse(Parser.java:130)
	at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:255)
	at org.apache.jasper.compiler.ParserController.parse(ParserController.java:103)
	at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:185)
	at org.apache.jasper.compiler.Compiler.compile(Compiler.java:347)
	at org.apache.jasper.compiler.Compiler.compile(Compiler.java:327)
	at org.apache.jasper.compiler.Compiler.compile(Compiler.java:314)
	at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:592)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
08/01/2011 19:47:01 org.apache.catalina.loader.WebappClassLoader modified
INFO:     Additional JARs have been added : 'jstl-api-1.2.jar'
08/01/2011 19:47:01 org.apache.catalina.core.StandardContext reload
INFO: Reloading this Context has started
08/01/2011 19:47:01 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
GRAVE: The web application [/fj21-agenda] registered the JBDC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

Eu consigo adicionar, alterar e remover, porem so nao consigo retornar a lista…

axo q falta o jar do jstl…veja a msg no final…

veja, conforme coloquei print… o JSTL ja se encontra em fj21-agenda\WebContent\WEB-INF\lib

que também contém:
jstl-api-1.2.jar
jstl-impl-1.2.jar
mysql-connector-java-5.1.14-bin.jar
standard.jar

a não ser que estes estejam desatualizados, sei la ou q nao seja necessário estar nesta pasta…
alguem mais?

Eu acho que esse standard.jar está sobrando…

Ja acabei d remover fiz o teste eeeeee?!?! nao deu tbm :shock:

nao funciona nda…

Consigo realizar as inclusões em TestaInsere.java

package br.com.caelum.jdbc.teste;

import java.util.Calendar;
import br.com.caelum.jdbc.modelo.Contato;
import br.com.caelum.jdbc.dao.ContatoDAO;

public class TestaInsere {

	public static void main(String[] args) {
		
		// pronto para gravar
		Contato contato = new Contato();
		contato.setNome("Fulano");
		contato.setEmail("fulano@email.com.br");
		contato.setEndereco("abc");
		contato.setDataNascimento(Calendar.getInstance());
		
		ContatoDAO daoContato = new ContatoDAO();
		daoContato.adiciona(contato);
		
		System.out.println("Gravado");
	}

}

e no TestaListaContato.java

package br.com.caelum.jdbc.teste;

import java.util.List;

import br.com.caelum.jdbc.dao.ContatoDAO;
import br.com.caelum.jdbc.modelo.Contato;

public class TestaListaContato {

	public static void main(String[] args) {

		ContatoDAO contatoDAO = new ContatoDAO();
		List<Contato> meusContatos = contatoDAO.getLista();
		

		for (Contato contato : meusContatos) {
			System.out.println("Nome: " + contato.getNome());
			System.out.println("Email: " + contato.getEmail());
			System.out.println("Endereço: " + contato.getEndereco());
			System.out.println("Data de Nascimento: "
					+ contato.getDataNascimento().getTime() + "\n");
		}
	}

}

da erro:

Conectando ao banco
Exception in thread "main" java.lang.RuntimeException
	at br.com.caelum.jdbc.dao.ContatoDAO.getLista(ContatoDAO.java:79)
	at br.com.caelum.jdbc.teste.TestaListaContato.main(TestaListaContato.java:13)

e meu dao identico ao exemplo… :shock:

package br.com.caelum.jdbc.dao;

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

import br.com.caelum.jdbc.ConnectionFactory;
import br.com.caelum.jdbc.modelo.Contato;

public class ContatoDAO {

	private Connection connection;

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

	public void adiciona(Contato contato) {
		String sqlInsert = "INSERT INTO CONTATOS(NOME, EMAIL, ENDERECO, DATANASCIMENTO) VALUES "
				+ "(?, ?, ?, ?)";

		try {
			// prepara o statement para inserção
			PreparedStatement stmt = this.connection
					.prepareStatement(sqlInsert);

			// seta os 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();

			// fecha
			stmt.close();
		} catch (Exception e) {
			throw new RuntimeException();
		}

	}
	
	public List<Contato> getLista() {
		try {
			
			List<Contato> contatos = new ArrayList<Contato>();
			PreparedStatement stmt = this.connection.prepareStatement("select * from contatos;");
			ResultSet rs = stmt.executeQuery();
			
			while (rs.next()) {
				
				// criando objeto Contato para cada registro no BD
				Contato contato = new Contato();
				contato.setNome(rs.getString("NOME"));
				contato.setEmail(rs.getString("EMAIL"));
				contato.setEndereco(rs.getString("ENDERECO"));
				
				// montando a data atraves 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();
		}		
	}
}

aff encontrei o erro…

comentei as linhas abaixo:


while (rs.next()) {
				
				// criando objeto Contato para cada registro no BD
				Contato contato = new Contato();
				contato.setNome(rs.getString("NOME"));
				contato.setEmail(rs.getString("EMAIL"));
				contato.setEndereco(rs.getString("ENDERECO"));
				
				// montando a data atraves do calendar
				/*
                                Calendar data = Calendar.getInstance();
				data.setTime(rs.getDate("DATANASCIMENTO"));
				contato.setDataNascimento(data);
				*/
				// adicionando o objeto à lista
				contatos.add(contato);				
			}

// E NA HORA DE IMPRIMIR TBM COMENTEI ****

               for (Contato contato : meusContatos) {
			System.out.println("Nome: " + contato.getNome());
			System.out.println("Email: " + contato.getEmail());
			System.out.println("Endereço: " + contato.getEndereco());
			//System.out.println("Data de Nascimento: "
				//	+ contato.getDataNascimento().getTime() + "\n");
		}

E agora pergunto!!

Porque ocorre o erro ai nestas linhas comentadas… sendo q esta igual a apostila :shock:

indo mais adiante comentei somente a seguinte linha

//data.setTime(rs.getDate("dataNascimento"));

mas a Data de Nascimento dos meus contatos… seria a mesma pra tdo mundo

Data de Nascimento: Sun Jan 09 16:40:22 GMT-03:00 2011

Se conseguir avançar o pq disso ocorre, postarei a resposta…
caso alguem puder me ajudar tbm… agradeço… :smiley:

No seu ContatoDao, nas linhas do “throw new RuntimeException()” coloca o argumento da SQLException para a gente saber qual é o erro exatamente. Troque para “throw new RuntimeException(e)”

Sergio Lopes, obrigado por tentar me ajudar…
fiz conforme oq vc disse, e retornou o seguinte erro:

Conectando ao banco
Exception in thread "main" java.lang.RuntimeException: java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date
	at br.com.caelum.jdbc.dao.ContatoDAO.getLista(ContatoDAO.java:82)
	at br.com.caelum.jdbc.teste.TestaListaContato.main(TestaListaContato.java:13)
Caused by: java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
	at com.mysql.jdbc.ResultSetRow.getDateFast(ResultSetRow.java:141)
	at com.mysql.jdbc.ByteArrayRow.getDateFast(ByteArrayRow.java:238)
	at com.mysql.jdbc.ResultSetImpl.getDate(ResultSetImpl.java:2194)
	at com.mysql.jdbc.ResultSetImpl.getDate(ResultSetImpl.java:2147)
	at com.mysql.jdbc.ResultSetImpl.getDate(ResultSetImpl.java:2210)
	at br.com.caelum.jdbc.dao.ContatoDAO.getLista(ContatoDAO.java:69)
	... 1 more

No MySQL, meu campo esta como DATE, as datas estão no formato [1970-08-08], [1953-05-29]
Estamos conseguindo… rs
Será vou ter q colocar esta data no formato certo, usando SimpleDateFormatt ?

Bom nao vou negar que no BD continha registros em que a data de nascimento era 0000-00-00

para eu conseguir fazer com que o exemplo da apostila desse certo, usei esta técnica:

delete from contatos where datanascimento = 0000-00-00

:-o

mas não é isso que eu quero… pq vai que um dia, me deparo com esta situação em que nao posso apagar os registros da tabela :shock:

bom…vagando pelo google da vida e pesquisando sobre este erro: Value ‘0000-00-00’ cannot be represented as java.sql.Date

http://www.google.com.br/search?sourceid=chrome&ie=UTF-8&q=can+not+be+represented+as+java.sql.Date

vi relatos em que deveria proceder colocando um “complemento” na url pra tratar este tipo de erro qnd alguma data é nula

Setting the connectstring value of zeroDateTimeBehavior=convertToNull will eliminate this exception and cause null values to return from the database. In this case, zero value date and datetime will appear as empty strings in ColdFusion output. mirroring the bahavior of the MySQL Connector/J 3.0.

ficando assim entao:

"jdbc:mysql://localhost/fj21?zeroDateTimeBehavior=convertToNull"

como na teoria tdo é perfeito… ja na prática nao é :frowning:
executando novamente, resulta…


Conectando ao banco
Exception in thread "main" java.lang.NullPointerException
	at java.util.Calendar.setTime(Unknown Source)
	at br.com.caelum.jdbc.dao.ContatoDAO.getLista(ContatoDAO.java:69)
	at br.com.caelum.jdbc.teste.TestaListaContato.main(TestaListaContato.java:13)

:frowning: :frowning: :frowning: :frowning:

Opa, estamos chegando lá!

O problema agora parace ser que a Date devolvida pode estar nula (caso seja 0000-00-00) e aí não conseguiríamos setar o calendário nessa linha:

data.setTime(rs.getDate("DATANASCIMENTO")); 

O melhor é extrair a variável e testar o nulo antes de setar:

Date date = rs.getDate("DATANASCIMENTO");
if (date != null) {
    data.setTime(date); 
}

Bom!! vamos la… para as considerações finais… rs

até onde o Sergio me ajudou, deu certo :thumbup:

Porém como nem tudo são flores…

aqui tbm acontece o mesmo erro: na hora do for imprimir a data novamente e dando “certo” até encontrar uma data null;

System.out.println(contato.getDataNascimento().getTime() + "\n");
Conectando ao banco
Nome: Fernando Henrique
Email: fernandoh.computacao@gmail.com
Endereço: Rua 01
Exception in thread "main" java.lang.NullPointerException
	at br.com.caelum.jdbc.teste.TestaListaContato.main(TestaListaContato.java:21)

E para ñ encher mais a paciencia de vcs com este tópico… heheh

resolvi… fazendo isso: :smiley:


package br.com.caelum.jdbc.teste;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import br.com.caelum.jdbc.dao.ContatoDAO;
import br.com.caelum.jdbc.modelo.Contato;

public class TestaListaContato {

	public static void main(String[] args) {

		ContatoDAO contatoDAO = new ContatoDAO();
		List<Contato> meusContatos = contatoDAO.getLista();
		
		for (Contato contato : meusContatos) {
			System.out.println("Nome: " + contato.getNome());
			System.out.println("Email: " + contato.getEmail());
			System.out.println("Endereço: " + contato.getEndereco());			
			System.out.println(getStringDate(contato.getDataNascimento()) + "\n");			
		}
	}
	
	public static String getStringDate(Calendar aDate) {
		
		StringBuffer sb = new StringBuffer("Data de Nascimento: ");
		DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
		
		if (aDate != null) {
			sb.append(df.format(aDate.getTime()));
		} else {
			sb.append("Não informada!");
		}
		
		return sb.toString();
	}

}

Se é a melhor maneira… num sei… poderia ter colocado na classe diretamente, ou fazer validação pra nao gravar dataNascimento como null, evitando tdo problema d vez

mas enfim… é isso ai… 8)

valeu… Sergio Lopes, luxu :thumbup: