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

14 respostas Resolvido
tomcateclipseapachejava
berkshire

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

14 Respostas

Lucas_Camara

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

berkshire

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

    }

Lucas_Camara

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

berkshire

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

Lucas_Camara
Solucao aceita

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.

berkshire

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

Lucas_Camara

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

berkshire

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?

Lucas_Camara

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

berkshire

Pior que está


Este é o projeto que gerou o ContatoDao.jar
image

Lucas_Camara

Posta o código desse método.

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

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

Funcionou amigo, muito obrigado!!!

Criado 31 de janeiro de 2020
Ultima resposta 1 de fev. de 2020
Respostas 14
Participantes 2