[Resolvido] Erro ao efetuar login em sistema via .jar

Gente,
Sequinte, tenho 2 sistemas que devem trabalhar juntos via integração .jar . S1 (principal) e S2
Eles estão organizados segundo o padrão MVC (ModelViewController). Em S1 eu consigo efetuar login normalmente através do driver jdbc para Mysql. O S2 é quem recebe um .jar do S1 para reutilização das suas classes, logo em S2 ao tentar efetuar login, a seguinte tela de erros aparece:

[b]HTTP Status 500 - javax.servlet.ServletException: java.lang.NoSuchMethodError: jdbc.ConnectionFactory.getConnection1()Ljava/sql/Connection;


type Exception report

message javax.servlet.ServletException: java.lang.NoSuchMethodError: jdbc.ConnectionFactory.getConnection1()Ljava/sql/Connection;

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

exception

org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.NoSuchMethodError: jdbc.ConnectionFactory.getConnection1()Ljava/sql/Connection;
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:455)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

root cause

javax.servlet.ServletException: java.lang.NoSuchMethodError: jdbc.ConnectionFactory.getConnection1()Ljava/sql/Connection;
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:912)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:841)
org.apache.jsp.login_jsp._jspService(login_jsp.java:143)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

root cause

java.lang.NoSuchMethodError: jdbc.ConnectionFactory.getConnection1()Ljava/sql/Connection;
dao.UsuarioDAO.(UsuarioDAO.java:22)
org.apache.jsp.login_jsp._jspService(login_jsp.java:73)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.30 logs.


Apache Tomcat/7.0.30[/b]

OBS.: getConnection1 = método implementado na classe ConnectionFactory, dentro do pacote jdbc, que é responsável pela conexão com o banco do S1.

Alguém pode me ajudar?
Eu estou tentando correr atrás do significado dessas Exceptions, mas o problema que ocorre apenas em um dos sistemas!

Agradeço desde já.

Valéria.

e o jar do bd ? :smiley:
kd?

jar do bd???

Como está configurado o pool de conexões? Você sabe se o connector (driver) do MySQL está no classpath da aplicação ou mesmo na pasta “lib” do TomCat?

Ao clicar em Login, o sistema valida os campos, faz a conexão DAO e chama o método do login na classe UsuarioDAO, validando meu login.
O driver do Mysql eu deixei na pasta lib do Tomcat sim.

No S1 funciona, mas será que por eu estar importando o .jar DO S1 na pasta WEB-INF/lib do S2, e este usar conexão com o banco, dá algum tipo de problema?

Então, o driver do mysql é uma dependência do seu projeto (X).

Se o projeto Y utiliza um jar do projeto X, ele precisa carregar suas dependencias.
Portanto ele precisa do jar do mysql no classpath da mesma maneira… Entendeu?

PS: Todo classNotFound é que uma classe não foi encontrada, alguns motivos:

  • nao deu build ainda
  • nao tem o jar no classpath

:smiley:

abraços!

Pode fazer isso que disse e reiniciar o TomCat.

Caso não funcione, tenta o seguinte:

Copia o JAR do MySQL na pasta “lib” do TomCat:

C:\Program Files\Apache Software Foundation\Tomcat 7.0\lib (Se for em inglês seu Windows)
C:\Arquivos de Programdas\Apache Software Foundation\Tomcat 7.0\lib (Se for em português seu Windows)

[quote=d34d_d3v1l]PS: Todo classNotFound é que uma classe não foi encontrada, alguns motivos:

  • nao deu build ainda
  • nao tem o jar no classpath[/quote]

Entendi, mas o erro não seria esse:

java.lang.NoSuchMethodError: jdbc.ConnectionFactory.getConnection1()Ljava/sql/Connection;

em vez de classNotFound?

Adicionei o driver do Mysql TAMBÉM na lib do meu S2, add ele no classpath e o erro continua! (restartei o servidor, fiz o clean e o build novamente)

Tem como você informar como está sua configuração do pool de conexões de banco de dados? Posta pra nóis.

Essa a minha classe ConnectionFactory.java:

[code]package jdbc;

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

public class ConnectionFactory {
/*
public Connection getConnection() throws SQLException{

	//System.out.println("Conectando ao banco");

	try{
		Class.forName("org.gjt.mm.mysql.Driver"); 
		return DriverManager.getConnection("jdbc:mysql://localhost:3306/dac_cadastros","root","") ;
	}catch(SQLException e1){
		throw new RuntimeException(e1) ;
	}catch(Exception e){
		throw new RuntimeException(e) ;
	}
	
}//Fecha getConnection
*/

public Connection getConnection1() throws SQLException{

	//System.out.println("Conectando ao banco");
	try{
		Class.forName("org.gjt.mm.mysql.Driver"); 
		return DriverManager.getConnection("jdbc:mysql://localhost:3306/dac_cadastros","root","") ;
	}catch(SQLException e1){
		throw new RuntimeException(e1) ;
	}catch(Exception e){
		throw new RuntimeException(e) ;
	}
	
}//Fecha getConnection

}//Fecha classe
[/code]

Esse é o login.jsp que também funciona em S1 legalzinho:
[O form de login chama esse jsp.]

[code]<%@ page language=“java” import=“java.util."%>
<%@page import="modelo.
”%>
<%@page import=“dao.*”%>

<%
String pagina ="";//pagina que sera redirecionada depois de logado
String loginusuario= request.getParameter(“loginusuario”); // Pega o Login vindo do formulário
String senhausuario= request.getParameter(“senhausuario”); //Pega a senha vinda do formulário
UsuarioDAO dao = new UsuarioDAO();

//Verifica se as entradas estão vazias
if ((loginusuario == "")||(senhausuario == "")){
	pagina= "index.jsp";
	String erro="1";
	%>
	<jsp:forward page= "<%= pagina %>">
		<jsp:param name="msg" value="<%= erro %>"/>
	</jsp:forward>
	
<%} else {
	Usuario u = new Usuario(loginusuario, senhausuario);
	//login e senha verificados estão corretos
	int id = dao.verificarUsuario(u);
	
	
	if(id!=0){
		pagina= "index.jsp";
		String msgsucess = "3";
		//registra a sessão
		HttpSession nsession = request.getSession(true) ;
		nsession.setAttribute("login", loginusuario) ;
		nsession.setAttribute("loginidcliente", id);
		//registra o cookie do usuario logado e redireciona para home
		//if(username==null) username="";
		
		/*Date now = new Date();
		String timestamp = now.toString();
		Cookie cookie = new Cookie ("login",loginusuario);
		cookie.setMaxAge(30*60);
		response.addCookie(cookie);*/
		
		%><jsp:forward page="<%= pagina %>">
			<jsp:param name="msg" value="<%= msgsucess %>"/>
		</jsp:forward>	<%
	} else {
		pagina= "index.jsp";
		String erro="2";
		//redireciona para página inicial mostrando qual foi o erro
		%>
		<jsp:forward page= "<%= pagina %>">
			<jsp:param name="msg" value="<%= erro %>"/>
		</jsp:forward>	
	<%}
}

%>[/code]

Valéria,

se você quiser, posso verificar seu projeto por completo na próxima semana. Envie um email pelo meu blog (http://oracle2java.blogspot.com/).

O problema central está dentro do construtor da classe UsuarioDAO quando ele invoca o método getConnection1() ele não encontra, isso significa claramente que jdbc.ConnectionFactory não está ao alcance ou não foi esta classe a importada por UsuarioDAO. No entanto, isso não está aberto no código que você enviou.

Verifica em sua classe UsuarioDAO como é que está sendo importada a classe ConnectionFactory, pois devia ter algo como “import jdbc.*;” ou “import jbdc.ConnectionFactory;” nas primeiras linhas de sua UsuarioDAO.

O jdbc.ConnectionFactory ainda deverá estar no build (ou release) do WAR da sua aplicação.

Não gostaria de ficar apontando todas as possibilidades mesmo, melhor será uma inspeção completa do projeto.

Entre em contato caso não encontre solução.

Boa sorte.

Wiliam

Willian,
vou ver se chego em uma solução nos próximos dias, senão entrarei em contato por email contigo anexando o meu sisteminha e o problema.

Mas só pra constar a classe UsuarioDAO se encontra assim:

[code]package dao;

//Pacotes de importação
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.SQLException;
import com.mysql.jdbc.exceptions.* ;

import jdbc.ConnectionFactory;
import modelo.Usuario ;

public class UsuarioDAO {

private Connection connection = null ;

public UsuarioDAO(){
	
	try{
		this.connection = new ConnectionFactory().getConnection1() ;
	}catch(SQLException e){
		//throw new RuntimeException(e) ;
		System.out.println("Erro ao conectar com o banco de dados: dac_cadastros!");
	}
	
}//Fecha construtor	


//Função  para cadastro de cliente
public boolean cadastrarCliente(Usuario u) {
	
	//Forma a SQL para inserção no BD
	
	String sql = "INSERT INTO usuario (nome, cpf, tipodoc, numdoc, emissor, dtemiss, sexo, datanasc, estadocivil, email, conjuge, nomepai, nomemae, numtelefone, nacionalidade, naturalidade, capacidadecivil, ocupacao, inicioocupacao, empregador, renda, nomeusuario, senhausuario, isfuncionario, idendereco, situacao) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)" ;
	
	try{
        //Prepara a SQL com os valores do objeto Usuario recebido
		PreparedStatement stmt = connection.prepareStatement(sql) ;
		
        stmt.setString(1, u.getNome()) ;
        stmt.setString(2, u.getCpf()) ;
        stmt.setString(3, u.getTipodoc()) ;
        stmt.setString(4, u.getNumdoc()) ;
        stmt.setString(5, u.getEmissor()) ;
        stmt.setString(6, u.getDtEmiss()) ;
        stmt.setString(7, u.getSexo()) ;
        stmt.setString(8, u.getDataNasc()) ;
        stmt.setString(9, u.getEstadocivil()) ;
        stmt.setString(10, u.getEmail()) ;
        stmt.setString(11, u.getConjuge()) ;
        stmt.setString(12, u.getNomepai()) ;
        stmt.setString(13, u.getNomemae()) ;
        stmt.setString(14, u.getNumTelefone()) ;
        stmt.setString(15, u.getNacionalidade()) ;
        stmt.setString(16, u.getNaturalidade()) ;
        stmt.setString(17, u.getCapacidadecivil()) ;
        stmt.setString(18, u.getOcupacao()) ;
        stmt.setString(19, u.getInicioocupacao()) ;
        stmt.setString(20, u.getEmpregador()) ;
        stmt.setFloat(21, u.getRenda()) ;
        stmt.setString(22, u.getNomeUsuario()) ;
        stmt.setString(23, u.getSenhaUsuario()) ;
        stmt.setBoolean(24, false) ;
        stmt.setInt(25, u.getIdendereco()) ;
        stmt.setString(26, u.getSituacao()) ;
        
        stmt.execute() ;
        stmt.close() ;
        
        return true ; //Retorna verdadeiro caso a inserção seja bem sucedida
        
    }catch(SQLException e1){
    	return false ; //Retorna falso caso haja algum erro na SQL
    }catch(Exception e){
    	return false ; //Retorna erro caso haja algum outro erro
    }
	
}//Fecha cadastrarCliente() ... e mais um monte de métodos implementados

[/code]

… a idéia é fazer o import do jdbc dentro dessa classe, pois é na chamada do seu construtor que o getConnection1 é chamado!

opa

troca

            Class.forName("org.gjt.mm.mysql.Driver");   

por


            Class.forName("com.mysql.jdbc.Driver");

[quote=d34d_d3v1l]opa

troca

            Class.forName("org.gjt.mm.mysql.Driver");   

por

[code]

        Class.forName("com.mysql.jdbc.Driver");

[/code][/quote]

Tentei mudar isso também, mas sem sucesso.
Funciona apenas no sistema principal, no 2°, aquele que utiliza o .jar, a exceção continua:

javax.servlet.ServletException: java.lang.NoSuchMethodError: jdbc.ConnectionFactory.getConnection1()Ljava/sql/Connection;

Gera o jar da sua primeira aplicação novamente,
substitua no projeto, depois compila o projeto e testa :wink:
PS: vc tem ctza q ta tudo certo no classpath ne?

to no aguardo

Pois então, depois que eu modifiquei o classForName , eu havia gerado o .jar de novo pra importar…
Sempre que eu importo um .jar eu clico em Add Build Path e também ‘botão direito no projeto’ > Properties > Java Build Path e adiciono lá o .jar também!

O problema não é com o driver, pois como disse, claramente não achou o método getConnection1() remetendo a um problema na preparação do WAR.

Tudo bem,
mas que nem o williamps falou, os jars devem ficar na pasta LIB do web-inf,
todas suas dependências…

Faz o seguinte: cria um método de teste que retorna uma String qualquer…

joga no jar, compila do jeito q vc faz normal,
e tenta chamar esse método na aplicação e ve se vai funcionar

abraço

SIM, os jars também estão na WEB-INF/lib
Vou testar mais…

Consegui identificar a confusão:

O problema estava aqui: no S1, na classe ConnectionFactory aparecia o getConnection1 apontando pro bd 1 e no outro sistema, o ConnectionFactory aparece o getConnection1 apontando para seu bd (outro banco) , ou seja, confusão e conflito das classes, já que elas existiam nos dois projetos, acabei percebendo que tinha uma salada de conexões no sistema, ao invés de uma “fábrica de conexões” :oops:

Muito obrigada a todos pela atenção, vocês me ajudaram a ficar pensando no problema de todas as formas possíveis até encontrar o erro! Valeu!

Valéria.