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

19 respostas
juni0r25
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:
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.<init>(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.<init>(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.

Se alguém puder ajudar!

19 Respostas

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…

juni0r25

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();

	}

}
drsmachado

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…


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á.

juni0r25

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);
		}
	}
		
}
drsmachado

Dá uma olhada aqui. Talvez ajude.

juni0r25

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
drsmachado

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?

juni0r25
esse é a linha:
PreparedStatement stmt = connection.prepareStatement(sql);
deste método:
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);
		}
	}
Ruttmann

drsmachado:
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…


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á.


Realmente, errei.

:stuck_out_tongue:

drsmachado
juni0r25:
esse é a linha:
PreparedStatement stmt = connection.prepareStatement(sql);
deste método:
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);
		}
	}
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.
drsmachado

Ruttmann:

Realmente, errei.

:P


Eu apanhei muito desse erro no começo, por isso aprendi.

juni0r25
Sim sim:
public class ContatoDAO {
	
	//É o plug para se conectar no banco
	private Connection connection;
	
	public ContatoDAO(){
		this.connection = new ConnectionFactory().getConnection();
	}
drsmachado

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.

juni0r25

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!

juni0r25

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
drsmachado

E no debug, o que está nulo?

drsmachado
juni0r25:
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
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)
juni0r25
Consegui resolver agora eu tinha que implementar dessa forma a classe ConnectionFactory;
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);
		}
		
	}

}
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.

juni0r25

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

Criado 20 de setembro de 2013
Ultima resposta 25 de set. de 2013
Respostas 19
Participantes 3