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

21 respostas
valeriatads

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.

21 Respostas

d34d_d3v1l

e o jar do bd ? :smiley:
kd?

valeriatads

jar do bd???

W

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?

valeriatads

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?

d34d_d3v1l

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!

W

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)

valeriatads

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

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

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)

W

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

valeriatads

Essa a minha classe ConnectionFactory.java:

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

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

<%@ 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>	
		<%}
	}
	

%>
W

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

valeriatads

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:

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

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

d34d_d3v1l

opa

troca

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

por

Class.forName("com.mysql.jdbc.Driver");
valeriatads
d34d_d3v1l:
opa

troca

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

por

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

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;

d34d_d3v1l

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

valeriatads

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!

W

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.

d34d_d3v1l

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

valeriatads

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

valeriatads

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.

W

Nós tentamos e você achou a resposta. Esta sim é a melhor solução.

Você mesma conseguiu encontrar a solução. Muito bom!!!

É nóis.

d34d_d3v1l

Opa… que bom que resolveu…

abraços

Criado 28 de setembro de 2012
Ultima resposta 30 de set. de 2012
Respostas 21
Participantes 3