Problemas Struts2 - Java Magazine

6 respostas
Thyago

Boa Tarde, Estou tentando aprender Struts2 para usar no meu trabalho, comecei com a revista Java Magazine edição 41 onde mostra o desenvolvimento de uma aplicação de cadastro. Porém quando gero o .war e abro no tomcat versao 5.5 é apresentado a seguinte msg:

Struts Problem Report
The Struts has detected an unhandled exception: 

Messages: Erro ao acessar banco de dados.  
File: br/com/jm/dao/DAOService.java 
Line number: 100 


--------------------------------------------------------------------------------

Stacktraces
java.lang.RuntimeException: Erro ao acessar banco de dados. 
    br.com.jm.dao.DAOService.getPerfis(DAOService.java:100)
    br.com.jm.action.UsuarioAction.prepare(UsuarioAction.java:34)
    com.opensymphony.xwork2.interceptor.PrepareInterceptor.intercept(PrepareInterceptor.java:112)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:155)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.intercept(ParametersInterceptor.java:118)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:123)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:180)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    org.apache.struts2.impl.StrutsActionProxy$1.call(StrutsActionProxy.java:25)
    org.apache.struts2.impl.StrutsActionProxy$1.call(StrutsActionProxy.java:24)
    org.apache.struts2.impl.RequestContextImpl.callInContext(RequestContextImpl.java:147)
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:23)
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:317)
    org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:239)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
    org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
    org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    java.lang.Thread.run(Thread.java:619)
    

--------------------------------------------------------------------------------

You are seeing this page because development mode is enabled. Development mode, or devMode, enables extra debugging behaviors and reports to assist developers. To disable this mode, set: 

  struts.devMode=false

in your WEB-INF/classes/struts.properties file.

Efetuei teste com o driver do mysql e funciona normalmente em outra aplicação. Já vi login e senha e endereço do server que está o DB e está correto!
Abaixo descrevo o codigo da classe DAOService

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;


import br.com.jm.model.Departamento;
import br.com.jm.model.Perfil;
import br.com.jm.model.Usuario;


public class DAOService {

  private static Connection getConnection() throws ClassNotFoundException,
      SQLException
  {
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/struts",
  "xxx", "xxx");
    return conn;
  }

  public static Collection<Usuario> getUsuarios() {
    try {
      Connection conn = getConnection();

      Statement stmt = conn.createStatement();

      String sql = "select u.id uid, u.nome unome, u.data_nascimento udata, p.id pid, p.nome pnome, d.id did, d.nome dnome from usuario u inner join perfil p on u.id_perfil = p.id inner join departamento d on u.id_departamento = d.id";
      ResultSet rs = stmt.executeQuery(sql);

      List<Usuario> usuarios = new ArrayList<Usuario>();

      while (rs.next()) {
        Usuario usuario = new Usuario(rs.getLong("uid"), rs.getString("unome"), rs.getDate("udata"));
        Departamento departamento = new Departamento(rs.getInt("did"), rs
            .getString("dnome"));
        Perfil perfil = new Perfil(rs.getInt("pid"), rs.getString("pnome"));
        usuario.setDepartamento(departamento);
        usuario.setPerfil(perfil);
        usuarios.add(usuario);
      }
      return usuarios;
    }
    catch (Exception e) {
      e.printStackTrace();
      throw new RuntimeException("Erro ao acessar banco de dados.");
    }
  }

  public static Collection<Departamento> getDepartamentos() {
    try {
      Connection conn = getConnection();

      Statement stmt = conn.createStatement();

      String sql = "select id, nome from departamento";
      ResultSet rs = stmt.executeQuery(sql);

      List<Departamento> departamentos = new ArrayList<Departamento>();

      while (rs.next()) {
        Departamento departamento = new Departamento(rs.getInt("id"), rs
            .getString("nome"));
        departamentos.add(departamento);
      }
      return departamentos;
    }
    catch (Exception e) {
      e.printStackTrace();
      throw new RuntimeException("Erro ao acessar banco de dados.");
    }
  }

  public static Collection<Perfil> getPerfis() {
    try {
      Connection conn = getConnection();

      Statement stmt = conn.createStatement();

      String sql = "select id, nome from perfil";
      ResultSet rs = stmt.executeQuery(sql);

      List<Perfil> perfis = new ArrayList<Perfil>();

      while (rs.next()) {
        Perfil perfil = new Perfil(rs.getInt("id"), rs.getString("nome"));
        perfis.add(perfil);
      }
      return perfis;
    }
    catch (Exception e) {
      e.printStackTrace();
      throw new RuntimeException("Erro ao acessar banco de dados.");
    }
  }

  public static Usuario getUsuario(Long id) {
    try {
      Connection conn = getConnection();

      String sql = "select u.id uid, u.nome unome, u.data_nascimento udata, p.id pid, p.nome pnome, d.id did, d.nome dnome from usuario u inner join perfil p on u.id_perfil = p.id inner join departamento d on u.id_departamento = d.id where u.id = ?";
      PreparedStatement stmt = conn.prepareStatement(sql);
      stmt.setLong(1, id);
      ResultSet rs = stmt.executeQuery();

      if (rs.next()) {
        Usuario usuario = new Usuario(rs.getLong("uid"), rs.getString("unome"), rs.getDate("udata"));
        Departamento departamento = new Departamento(rs.getInt("did"), rs
            .getString("dnome"));
        Perfil perfil = new Perfil(rs.getInt("pid"), rs.getString("pnome"));
        usuario.setDepartamento(departamento);
        usuario.setPerfil(perfil);
        return usuario;
      }
      return null;
    }
    catch (Exception e) {
      e.printStackTrace();
      throw new RuntimeException("Erro ao acessar banco de dados.");
    }
  }

  public static void saveUsuario(Usuario usuario) {
    try {
      Connection conn = getConnection();

      String sql = "insert into usuario(nome, id_perfil, id_departamento, data_nascimento ) values(?,?,?,?)";
      PreparedStatement stmt = conn.prepareStatement(sql);
      stmt.setString(1, usuario.getNome());
      stmt.setInt(2, usuario.getPerfil().getId().intValue());
      stmt.setInt(3, usuario.getDepartamento().getId().intValue());
      Date sqlDate = new Date(usuario.getDataNascimento().getTime());
      stmt.setDate(4, sqlDate);
      stmt.execute();

    }
    catch (Exception e) {
      e.printStackTrace();
      throw new RuntimeException("Erro ao acessar banco de dados.");
    }
  }

  public static void updateUsuario(Usuario usuario) {
    try {
      Connection conn = getConnection();

      String sql = "update usuario set nome = ?, id_perfil = ?, id_departamento = ? where id = ?";
      PreparedStatement stmt = conn.prepareStatement(sql);
      stmt.setString(1, usuario.getNome());
      stmt.setInt(2, usuario.getPerfil().getId());
      stmt.setInt(3, usuario.getDepartamento().getId());
      stmt.setLong(4, usuario.getId());
      System.out.println("Update usuario: "+stmt);
      stmt.execute();

    }
    catch (Exception e) {
      e.printStackTrace();
      throw new RuntimeException("Erro ao acessar banco de dados.");
    }
  }

  public static void removeUsuario(Usuario usuario) {
    try {
      Connection conn = getConnection();

      String sql = "delete from usuario where id = ?";
      PreparedStatement stmt = conn.prepareStatement(sql);
      stmt.setLong(1, usuario.getId());
      System.out.println("Delete usuario: "+stmt);
      stmt.execute();
    }
    catch (Exception e) {
      e.printStackTrace();
      throw new RuntimeException("Erro ao acessar banco de dados.");
    }
  }

}

O erro mesmo erro é apresentado para a declaração

throw new RuntimeException("Erro ao acessar banco de dados.");

declarada na linha 53 e na linha 100 respectivamente os metodos
getUsuarios() e getPerfis()

Aguardo a ajuda… Agradeço a todos desde já!

6 Respostas

Thyago

Complementando estou utilizando a versão 5 do java e 5.0 do mysql.

fernei

Thyago,

N!ao entendi o pq vc retorna sua conexão?!?!?!

private static Connection getConnection() throws ClassNotFoundException,   
      SQLException   
  {   
    Class.forName("com.mysql.jdbc.Driver");   
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/struts",   
  "xxx", "xxx");   
    return conn;   // Pq este retorno????
  }

Coloquei um exemplo bem simples ai,

public class JDBCExemplo { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost/teste", ?root?, ??); System.out.println("Conectado!"); con.close(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } }

Ambos os erros acontecem pq sua aplicação não está conseguindo se conectar com o banco, faz um Debug no metodo de conexão e vê direitinho a onde ele para ok?

Vlww!!!

Thyago

Fernei, obrigado pela ajuda!!!

Então efetuei o Debug como vc falou e apresenta a seguinte msg… seria problema com driver???

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1386)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1232)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:169)
	at br.com.jm.dao.DAOService.getConnection(DAOService.java:23)
	at br.com.jm.dao.DAOService.getPerfis(DAOService.java:83)
	at br.com.jm.action.UsuarioAction.prepare(UsuarioAction.java:34)
	at com.opensymphony.xwork2.interceptor.PrepareInterceptor.intercept(PrepareInterceptor.java:112)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
	at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:155)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.intercept(ParametersInterceptor.java:118)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
	at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:123)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
	at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:180)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
	at org.apache.struts2.impl.StrutsActionProxy$1.call(StrutsActionProxy.java:25)
	at org.apache.struts2.impl.StrutsActionProxy$1.call(StrutsActionProxy.java:24)
	at org.apache.struts2.impl.RequestContextImpl.callInContext(RequestContextImpl.java:147)
	at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:23)
	at org.apache.struts2.components.ActionComponent.executeAction(ActionComponent.java:237)
	at org.apache.struts2.components.ActionComponent.end(ActionComponent.java:137)
	at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:35)
	at org.apache.jsp.index_jsp._jspx_meth_s_005faction_005f0(index_jsp.java:189)
	at org.apache.jsp.index_jsp._jspx_meth_s_005fdiv_005f0(index_jsp.java:160)
	at org.apache.jsp.index_jsp._jspService(index_jsp.java:81)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Thread.java:619)

Já coloquei duas versoes do driver do mysql, mas a mesma msg é apresentada.

respondendo a sua pergunta sobre o conn… Esse codigo é o disponibilizado na Java Maga ai já estava assim… estou tentando executar ele primerio para depois tentar efetuar algumas modificações. O que eu entendi do
return conn é que estão tentando proteger a variavel ou estão deixando tudo separado para o pessoal iniciante (assim como eu) não se atrapalhasse. Mas após conseguir executar com sucesso vou tentar utilizar o outras maneiras de conexao.
Obrigado e aguardo a ajuda novamente!

jgbt

Sim, isso é problema de classpath, o servidor não esta achando o driver de conexão do mysql.
Onde vc esta colocando o driver?
Normalmente ele fica na pasta em WEB-INF/lib no seu projeto ou em alguma pasta de bibliotecas do servidor.

[]´s

fernei

Mais uma coisa, alem de colocar na pasta lib vc tem q add o JAR na ClassPath do Projeto.

Veja se ele ja se encontra lá, caso contrário coloca na pasta lib e referencia no ClassPath do projeto.

Qualquer duvida posta ai novamente, estamos aqui para ajudar…

Thyago

jgbt e fernei Obrigado!!! Essa ultima mensagem era problema no classpath mesmo. Eu estava adicionando ele porém mesmo quando dava um refresh ou compilava ele num estava levando o jar do mysql para a pasta lib… Mas agora está funcionando sim… vou fuçar e ver se faço alterações nele. Agradeço pela ajuda!

Criado 8 de janeiro de 2009
Ultima resposta 8 de jan. de 2009
Respostas 6
Participantes 3