Erro de conxecao com banco de dados Postgres - HTTP Status 500 - java.sql.SQLException

Olá pessoal estou fazendo a apostila da caelum fj21, e estou tentando inserir alguns dados no banco. Estou usando o postgres. Mas quando eu executo aparece essa tela de erro no navegador:

[code]HTTP Status 500 - java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/postgres

type Exception report

message java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/postgres

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

exception

java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/postgres
br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:13)
br.com.caelum.jdbc.dao.ContatoDAO.(ContatoDAO.java:21)
br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:46)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
root cause

java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/postgres
java.sql.DriverManager.getConnection(DriverManager.java:596)
java.sql.DriverManager.getConnection(DriverManager.java:215)
br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:11)
br.com.caelum.jdbc.dao.ContatoDAO.(ContatoDAO.java:21)
br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:46)
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.42 logs.
[/code]

Se alguém puder ajudar!

Você precisa adicionar o driver de conexão do banco de dados e referenciá-lo no build path do seu projeto. Já fez isso?

Esse erro geralmente acontece quando não se encontra o driver…

Sim eu fiz isso.
Eu coloquei o drive do Postgres, coloquei o jar no classpth (build path).
Build Path > add to Build Path.

Mais ainda continua com o mesmo erro.

esta minha classe de conexão:

package br.com.caelum.servlet;

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

import br.com.caelum.jdbc.ConnectionFactory;

public class TestaConexao {

	public static void main(String[] args) throws SQLException {

		Connection connection = new ConnectionFactory().getConnection();
		System.out.println("Conexão Aberta");
		connection.close();

	}

}

[quote=Ruttmann]Você precisa adicionar o driver de conexão do banco de dados e referenciá-lo no build path do seu projeto. Já fez isso?

Esse erro geralmente acontece quando não se encontra o driver…[/quote]
Corrigindo, esse erro ocorre quando o driver não reconhece a URL definida para a tentativa de conexão.
Quando o driver não é encontrado, a exceção lançada é a simples NoClassDefFound ou mesmo ClassNotFoundException, afinal, o carregamento do driver é através de reflection.
A mensagem informada se refere à url

message java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/postgres  

Alguma coisa nela está errada
Poste a classe que contém a abertura da conexão, exatamente como a mesma está.

A classe é essa:

package br.com.caelum.jdbc;

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

public class ConnectionFactory {
	
	public Connection getConnection() {
		try{
			return DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres","postgres","123");
		}catch (SQLException e){
			throw new RuntimeException(e);
		}
	}
		
}

Dá uma olhada aqui. Talvez ajude.

infelizmente não deu certo, mais agora mudou o erro!

HTTP Status 500 - 

--------------------------------------------------------------------------------

type Exception report

message 

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

exception 

java.lang.NullPointerException
	br.com.caelum.jdbc.dao.ContatoDAO.adiciona(ContatoDAO.java:30)
	br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:47)
	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.42 logs.


--------------------------------------------------------------------------------

Apache Tomcat/7.0.42

Como não deu certo? Ele conseguiu passar da tentativa de conexão para um NullPointerException.
Veja

java.lang.NullPointerException  
    br.com.caelum.jdbc.dao.ContatoDAO.adiciona(ContatoDAO.java:30)

O que existe nesta linha?

esse é a linha:

PreparedStatement stmt = connection.prepareStatement(sql);

deste método:

[code]
public void adiciona(Contato contato){

	String sql ="insert into contatos(nome, email, endereco, dataNascimento) values (?,?,?,?)";
	
	try{
		PreparedStatement stmt = connection.prepareStatement(sql);
		
		//seta os valor no banco
		stmt.setString(1,contato.getNome());
		stmt.setString(2,contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
		
		//executar
		stmt.execute();
		stmt.close();
	}catch(SQLException e){
		throw new RuntimeException(e);
	}
}[/code]

[quote=drsmachado][quote=Ruttmann]Você precisa adicionar o driver de conexão do banco de dados e referenciá-lo no build path do seu projeto. Já fez isso?

Esse erro geralmente acontece quando não se encontra o driver…[/quote]
Corrigindo, esse erro ocorre quando o driver não reconhece a URL definida para a tentativa de conexão.
Quando o driver não é encontrado, a exceção lançada é a simples NoClassDefFound ou mesmo ClassNotFoundException, afinal, o carregamento do driver é através de reflection.
A mensagem informada se refere à url

message java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/postgres  

Alguma coisa nela está errada
Poste a classe que contém a abertura da conexão, exatamente como a mesma está.
[/quote]
Realmente, errei.

:stuck_out_tongue:

[quote=juni0r25]esse é a linha:

PreparedStatement stmt = connection.prepareStatement(sql);

deste método:

[code]
public void adiciona(Contato contato){

	String sql ="insert into contatos(nome, email, endereco, dataNascimento) values (?,?,?,?)";
	
	try{
		PreparedStatement stmt = connection.prepareStatement(sql);
		
		//seta os valor no banco
		stmt.setString(1,contato.getNome());
		stmt.setString(2,contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
		
		//executar
		stmt.execute();
		stmt.close();
	}catch(SQLException e){
		throw new RuntimeException(e);
	}
}[/code]
[/quote]

De onde vem esse objeto connection? Onde ele é instanciado? Note que dentro deste método isso não ocorre, se ele não é instanciado no construtor da classe, estará nulo e disparará a exceção em questão.

[quote=Ruttmann]
Realmente, errei.

:P[/quote]
Eu apanhei muito desse erro no começo, por isso aprendi.

Sim sim:

[code]
public class ContatoDAO {

//É o plug para se conectar no banco
private Connection connection;

public ContatoDAO(){
	this.connection = new ConnectionFactory().getConnection();
}
[/code]

A única opção é que o método getConnection da classe ConnectionFactory está retornando um valor nulo.
Se o método é este

 public Connection getConnection() {  
        try{  
            return DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres","postgres","123");  
        }catch (SQLException e){  
            throw new RuntimeException(e);  
        }  
    }  

Provavelmente não está conseguindo estabelecer uma conexão.

Ainda não consegui solucionar, tentei tudo que você me passou, busquei em outros tópicos, também naquele informado. Mais até agora travei aqui nessa situação!

No console da ide esta aparecendo esse erro:

Set 20, 2013 5:14:03 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [AdicionaContato] in context with path [/fj21-agenda] threw exception
java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/postgres
	at br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:13)
	at br.com.caelum.jdbc.dao.ContatoDAO.<init>(ContatoDAO.java:21)
	at br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:47)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:724)
Caused by: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/postgres
	at java.sql.DriverManager.getConnection(DriverManager.java:596)
	at java.sql.DriverManager.getConnection(DriverManager.java:215)
	at br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:11)
	... 19 more

E no debug, o que está nulo?

[quote=juni0r25]No console da ide esta aparecendo esse erro:

[code]
Set 20, 2013 5:14:03 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [AdicionaContato] in context with path [/fj21-agenda] threw exception
java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/postgres
at br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:13)
at br.com.caelum.jdbc.dao.ContatoDAO.(ContatoDAO.java:21)
at br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:47)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/postgres
at java.sql.DriverManager.getConnection(DriverManager.java:596)
at java.sql.DriverManager.getConnection(DriverManager.java:215)
at br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:11)
… 19 more

[/code][/quote]
Neste caso voltamos ao primeiro erro.
A String que define a URL de conexão está incorreta (ao menos para a versão do driver que você usa)

Consegui resolver agora eu tinha que implementar dessa forma a classe ConnectionFactory;

[code]public class ConnectionFactory {

public Connection getConnection(){
	try {

		try {
			Class.forName("org.postgresql.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} 
		return DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "123");
		
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
	
}

}
[/code]
Eu estava fazendo assim:

public class ConnectionFactory {
	
	public Connection getConnection(){
		try{
			return DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres","postgres","123");
		} catch (SQLException e){
			throw new RuntimeException(e);
		}
	}
		
}

Obrigado, e agradeço pela disposição e Ajuda drsmachado.

Agora como eu faço para fechar ou pelo menos colocar que este tópico foi resolvido?