[Resolvido] Como instanciar uma classe que está dentro de uma library?

Olá, estou tentando instanciar uma classe, porém esta classe está dentro de uma biblioteca que eu mesmo fiz. A classe que estou tentando instanciar se chama ContatoDao. P/ fazer a instanciação estou usando o código:
<jsp:useBean id="dao" class="fj21.jdbc.dao.ContatoDao"/>
Mas não está encontrando a classe ContatoDao, Assim está a organização do projeto no eclipse:
image

Pela imagem parece que o jar está corretamente no classpath do projeto, então tem que verificar se essa classe possui um construtor default ou um sem argumentos para que o jsp:useBean consiga criar a instância.

Dê uma olhada: https://www.javatpoint.com/jsp-useBean-action

1 curtida

O eclipse não estava aceitando o código, deletei o jar e transformei a minha biblioteca em jar de novo, coloquei no mesmo build path do meu projeto novamente e agora o eclipse aceitou. Porém o erro continua quando rodo no apache Tomcat:

Type Exception Report

Message /lista-contatos.jsp (line: [13], column: [10]) The value for the useBean class attribute [fj21.jdbc.dao.ContatoDao] is invalid.

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

org.apache.jasper.JasperException: /lista-contatos.jsp (line: [13], column: [10]) The value for the useBean class attribute [fj21.jdbc.dao.ContatoDao] is invalid. org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42) org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:443) org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:149) org.apache.jasper.compiler.Generator$GenerateVisitor.visit(Generator.java:1312) org.apache.jasper.compiler.Node$UseBean.accept(Node.java:1196) org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2392) org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2444) org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2450) org.apache.jasper.compiler.Node$Root.accept(Node.java:474) org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2392) org.apache.jasper.compiler.Generator.generate(Generator.java:3596) org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:255) org.apache.jasper.compiler.Compiler.compile(Compiler.java:379) org.apache.jasper.compiler.Compiler.compile(Compiler.java:358) org.apache.jasper.compiler.Compiler.compile(Compiler.java:345) org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:660) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:400) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Note The full stack trace of the root cause is available in the server logs.

Obs: a classe que estou instanciando tem construtora sem parâmetros, inclusive a classe é essa:> /*

Seu papel será gerenciar a conexão e inserir Contatos no banco de dados.
*/
package fj21.jdbc.dao;

import fj21.jdbc.ConnectionFactory;
import fj21.jdbc.modelo.Contato;
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;

/**
*

  • @author Rodrigo Rech
    */
    public class ContatoDao {

     // a conexão com o baanco de dados
     private Connection connection;
    
     public ContatoDao() {
         this.connection = new ConnectionFactory().getConnection();
     }
     
     public void adiciona(Contato contato) {
         String sql = "insert into contatos " +
         "(nome,email,endereco,dataNascimento)" +
         " values (?,?,?,?)";
    
         try {
             // prepared statement para inserção
             PreparedStatement stmt = connection.prepareStatement(sql);
    
             // 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();
             stmt.close();
         } 
         catch (SQLException e) {
             throw new RuntimeException(e);
         }
     }
     
     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 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);
         }
     }
    

    }

Você consegue instanciar ContatoDao em alguma classe do projeto onde essa JSP está?

1 curtida

Então, fui no src do projeto e criei um novo .java com o seguinte código:

import fj21.jdbc.dao.ContatoDao;

public class teste {

	public static void main(String[] args) {
		ContatoDao dao = new ContatoDao();
		dao.getLista();
	}

}

Rodou tranquilamente

Verifique se o jar (dbConnection.jar) foi adicionado no war gerado do projeto que vc está rodando no tomcat.

Abra o war com alguma ferramenta de compactação como Winrar, Winzip, 7z, etc.

1 curtida

Não está, deveria estar dentro de 'WEB-INF/lib " ?

Sim. Quando o projeto eh empacotado num war para rodar no servidor, as dependências devem ir junto no war para funcionar.

1 curtida

Entendi, eu tinha esquecido de colocar o contatoDao na pasta lib, agora que coloquei o erro parou, porém está dando outro erro:


Type Exception Report

**Message**  java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/caelum

**Description**  The server encountered an unexpected condition that prevented it from fulfilling the request.

**Exception**

org.apache.jasper.JasperException: java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/caelum org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:599) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:515) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

**Root Cause**

Porém essa conexão com o banco é feita no contatoDao, e está funcionando corretamente quando testo no contatoDao sozinho. Será que estou colocando o driver jdbc do postgresql no lugar errado?

1 curtida

Tem que verificar se o jar do driver do postgresql tambem esta indo no war.

1 curtida

Pior que está


Este é o projeto que gerou o ContatoDao.jar
image

Posta o código desse método.

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

Mude para:

public Connection getConnection() {
    try {
    	Class.forName("org.postgresql.Driver");
        return DriverManager.getConnection("jdbc:postgresql://localhost:5432/caelum", "postgres", "senhacorreta");
    } catch (SQLException e) {
        throw new RuntimeException(e);
    }
}
1 curtida

Funcionou amigo, muito obrigado!!!

1 curtida