JasperException e ClassCastException

Olá pessoal,

Estou recebendo o seguinte erro em um jsp:

exception

org.apache.jasper.JasperException
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)
	org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1063)
	org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)
	org.apache.struts.action.RequestProcessor.internalModuleRelativeForward(RequestProcessor.java:1001)
	org.apache.struts.tiles.TilesRequestProcessor.internalModuleRelativeForward(TilesRequestProcessor.java:345)
	org.apache.struts.action.RequestProcessor.processForward(RequestProcessor.java:560)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:209)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)

root cause

java.lang.ClassCastException
	org.apache.jsp.pages.gruposLista_jsp._jspService(gruposLista_jsp.java:135)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:99)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:325)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)
	org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1063)
	org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)
	org.apache.struts.action.RequestProcessor.internalModuleRelativeForward(RequestProcessor.java:1001)
	org.apache.struts.tiles.TilesRequestProcessor.internalModuleRelativeForward(TilesRequestProcessor.java:345)
	org.apache.struts.action.RequestProcessor.processForward(RequestProcessor.java:560)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:209)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)

Pelo que já vi, essa JasperException é muito genérica. E ainda por cima, nessa exceção ele não me ajuda muito, né?

No log, tenho essa mesma mensagem acima, mas com mais uma linha interessante:

2005-08-05 09:47:23,030 ERROR StandardWrapper[/AugeProducao:jsp]  -> Servlet.service() for servlet jsp threw exception

O jsp onde o erro acontece é este:

<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<%@ page import="auge.conexao.GruposService" %>
<%@ page import="java.util.List" %>

<html:html locale="true">
<head>
   <title>Listagem de Grupos</title>
   <html:base/>
</head>
<body bgcolor="white">


   <html:errors/>
   <%
      List gruposList = GruposService.getInstance().getGruposList();
      request.setAttribute("grupos", gruposList);
   %>

   <table border=1>
   <tr>
      <td>Grupo</td> 
      <td>Descrição</td>	
   </tr>
   <logic:iterate id="element" name="grupos"  type="auge.bean.Grupos" >
   <tr>
      <td><bean:write name="element" property="grupo" /></td>    
      <td><bean:write name="element" property="descricao" /></td>	
   </tr>
   </logic:iterate>
   </table>
<p>
<html:link action="/Grupos.do">Voltar</html:link>
</body>
</html:html>

O erro se dá na linha do bean:write. Alguém sabe o que pode estar errado? Estou aqui agora examinando o código .java gerado pra esse jsp e não consigo ver nada errado. Não tem nenhum tipo de casting aí, então pq p ClassCastException?

Agradeço a ajuda.

Mais uma info útil. A linha 135, indicada pela ClassCastException, eh a seguinte:

            element = (auge.bean.Grupos) _jspx_page_context.findAttribute("element");

então este é o casting que está dando erro, né… mas oras, o que tem de errado no meu JSP?

Isso

_jspx_page_context.findAttribute("element");

não está retornando um objeto da classe Grupos.

Imprima isso

System.out.println( _jspx_page_context.findAttribute("element").getClass() );

para saber o tipo.

Obrigada Lipe,

Não consigo pegar o tipo da classe de element com isso porque dá erro antes. Falei algo errado acima: o erro não se dá na linha do bean:write, e sim na linha do logic:iterate. Sorry.

Eu consigo no máximo pegar o tipo de “grupos”, que, sem surpresa alguma, é um java.util.ArrayList. Duh. Será que tem como eu saber de que é essa lista? Se ela realmente corresponde ao tipo auge.bean.Grupos?

Outra coisa que descobri com testes aqui é que mudando o HQL do método que me traz o List, o erro muda. Eu estava usando o método da seguinte forma:

    public List getGruposList() {
        Session session = ConnectionFactory.getInstance().getSession();
        
        try {
            Query query =
                    session.createQuery(
                    "select gp.grupo, gp.descricao from auge.bean.Grupos gp order by gp.descricao");
            return query.list();
            
        } catch (HibernateException e) {
            System.err.println("Hibernate Exception" + e.getMessage());
            throw new RuntimeException(e);
        } finally {
            if (session != null) {
                try {
                    session.close();
                } catch (HibernateException e) {
                    System.err.println("Hibernate Exception" + e.getMessage());
                    throw new RuntimeException(e);
                }
                
            }
        }
    }

Usando como acima, me dava o referido erro da ClassCastException. Achando que poderia haver algo errado com o HQL, mudei-o para:

select gp from auge.bean.Grupos gp order by gp.descricao

Aparentemente, pelo que vi pesquisando na net, esse abaixo seria o correto: pegar o objeto todo no select, e não colocar os atributos. Certo? (pergunto pq vi em um comentário em um forum desconhecido por mim, entao poderia estar errado).

Mas usando este segundo HQL obtenho o erro:

javax.servlet.jsp.JspException: Cannot find bean element in any scope
        at org.apache.struts.taglib.TagUtils.lookup(TagUtils.java:934)
        at org.apache.struts.taglib.bean.WriteTag.doStartTag(WriteTag.java:225)
        at org.apache.jsp.pages.gruposLista_jsp._jspx_meth_bean_write_0(gruposLista_jsp.java:229)
        at org.apache.jsp.pages.gruposLista_jsp._jspService(gruposLista_jsp.java:140)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:99)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:325)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:825)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:738)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:526)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:534)

Já recebi esse erro “Cannot find bean” anteriormente, mas foi de uma vez que eu tinha esquecido de adicionar a struts-logic no cabeçalho. Mas não é o caso agora.

Ao usar esse outro HQL, o trecho gerado no código java correspondente ao jsp é exatamente igual.

Alguém saberia qual dos dois realmente devo usar? Alguém pode me dar uma dica de como achar este erro?

Agradeço de novo…