JSF + RichFaces + Hibernate = "Error reading"

Olá.
Estou com um estranho erro ao tentar objer do banco de dados uma lista de objetos com Hibernate para visualizar numa <h:dataTable> do JSF.
Segue a Exception apresentada no browser quando a página é carregada:

[code]exception
javax.servlet.ServletException: /portal/usuarios/principal.xhtml @31,96 value="#{usuarioMB.todos}": Error reading ‘todos’ on type cms.managed.UsuarioMB
javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

root cause
javax.el.ELException: /portal/usuarios/principal.xhtml @31,96 value="#{usuarioMB.todos}": Error reading ‘todos’ on type cms.managed.UsuarioMB
com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:76)
javax.faces.component.UIData.getValue(UIData.java:582)
javax.faces.component.UIData.getDataModel(UIData.java:1063)
javax.faces.component.UIData.setRowIndex(UIData.java:417)
com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:85)
javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:788)
javax.faces.component.UIData.encodeBegin(UIData.java:879)
org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:275)
org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:258)
org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:279)
org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:258)
org.richfaces.renderkit.html.PanelRenderer.doEncodeChildren(PanelRenderer.java:200)
org.richfaces.renderkit.html.PanelRenderer.doEncodeChildren(PanelRenderer.java:195)
org.ajax4jsf.renderkit.RendererBase.encodeChildren(RendererBase.java:120)
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)
org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:277)
org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:258)
org.ajax4jsf.renderkit.html.AjaxOutputPanelRenderer.encodeChildren(AjaxOutputPanelRenderer.java:78)
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:592)
org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

root cause
java.lang.NullPointerException
br.gov.go.ceres.infra.MBGenerico.listar(MBGenerico.java:94)
cms.managed.UsuarioMB.getTodos(UsuarioMB.java:38)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
javax.el.BeanELResolver.getValue(BeanELResolver.java:62)
javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:64)
org.apache.el.parser.AstValue.getValue(AstValue.java:118)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
(…)[/code]
Para ilustrar melhor o cenário, segue o trecho de código do ManagedBean UsuarioMB chamado na página pelo <h:dataTable>:

public DataModel getTodos() throws Exception { this.dataModel = new ListDataModel(super.listar()); return this.dataModel; }
Esse ManagedBean extende de um ManagedBean Genérico, com o método:

public List&lt;E&gt; listar() throws Exception { return getDao().listar((Class) (E) getClass()); }
E, finalmente, no DAO Genérico, o método que está sendo executado pelo ManagedBean:

public List&lt;T&gt; listar(Class classT) { Session session = null; try { session = HibernateUtil.openSession(); Criteria criteria = session.createCriteria(classT); return (List&lt;T&gt;) criteria.list(); } catch (HibernateException ex) { throw ex; } finally { HibernateUtil.closeSession(session); } }
O arquivo “hibernate.cfg.xml” está assim:

&lt;hibernate-configuration&gt; &lt;session-factory&gt; &lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/property&gt; &lt;property name="hibernate.connection.driver_class"&gt;com.mysql.jdbc.Driver&lt;/property&gt; &lt;property name="hibernate.connection.url"&gt;jdbc:mysql://localhost:3306/ceresgog_ceresgo&lt;/property&gt; &lt;property name="hibernate.connection.username"&gt;ceresgog_ceresgo&lt;/property&gt; &lt;property name="hibernate.connection.password"&gt;ceresgoadmin&lt;/property&gt; &lt;/session-factory&gt; &lt;/hibernate-configuration&gt;
E o arquivo persistence.xml, assim:

&lt;persistence-unit name="pref-ceres-painelPU" transaction-type="JTA"&gt; &lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt; &lt;jta-data-source&gt;pref-ceres-jndi&lt;/jta-data-source&gt; &lt;properties&gt; &lt;/properties&gt; &lt;/persistence-unit&gt;
A classe HibernateUtil é a padrão criada pelo assistente do Netbeans mesmo, com apenas a adição do método “closeSession(Session session)”.
Por favor, o que estou fazendo de errado?

Opa,

Como esta maepado o seu faces-config.xml. Posta ele ae!

Ve se vc configurou corretamente o “usuarioMB” no seu faces-config.xml…Acredito que seja este o problema.

[quote=Sergio_2006]Opa,
Como esta maepado o seu faces-config.xml. Posta ele ae!
Ve se vc configurou corretamente o “usuarioMB” no seu faces-config.xml…Acredito que seja este o problema.
[/quote]
Fera, não estou com o projeto em mãos agora, à noite posto o faces-config.xml, mas já adianto que o “usuarioMB” está corretamente configurado no faces-config. Se eu retorno um DataModel com uma List preenchida de objetos “usuario” manualmente, funciona. O problema está no retorno do método “getDao().listar((Class) (E) getClass())”, que está vindo “null”, tanto que, se não estivesse configurado corretamente, o método “getTodos()” do usuarioMB vinculado no <h:dataTable> nem seria executado. Não sei o porque do Dao não estar retornando uma List e sim null.

Cara nao sei porque vc lança essa excessão quando vao popular o table, pelo jeito da excessão acho que o jsf nao ta conseguindo criar a página, se eu fosse vc criava um array sem pegar do hibernate na mao e populava o table pra ver se funciona.
Flw

Correto, não estaria funcionando, mas o problema pode estar no faces-config.xml de acordo com o mapeamento que vc fez para:

&lt;managed-bean&gt;
        &lt;managed-bean-name&gt;usuarioMB&lt;/managed-bean-name&gt;
        &lt;managed-bean-class&gt;br.com.usuarioMB&lt;/managed-bean-class&gt;
        &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;
    &lt;/managed-bean&gt;

Se estiver com o scope de request e caso o mesmo não possa ser de sessão faz o seguinte.

Acrescenta no cabeçalho da pagina jsp o seguinte codigo abaixo, isto significa que o vc não vai perder o estado(ciclo) do seu bean.

&lt;a4j:keepAlive beanName="usuarioMB"&gt;

Está é uma alternativa se o teu list estiver retornando os dados correto, ok.

abcs.

[quote=Sergio_2006]Correto, não estaria funcionando, mas o problema pode estar no faces-config.xml de acordo com o mapeamento que vc fez para:

&lt;managed-bean&gt;
        &lt;managed-bean-name&gt;usuarioMB&lt;/managed-bean-name&gt;
        &lt;managed-bean-class&gt;br.com.usuarioMB&lt;/managed-bean-class&gt;
        &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;
    &lt;/managed-bean&gt;

Se estiver com o scope de request e caso o mesmo não possa ser de sessão faz o seguinte.

Acrescenta no cabeçalho da pagina jsp o seguinte codigo abaixo, isto significa que o vc não vai perder o estado(ciclo) do seu bean.

&lt;a4j:keepAlive beanName="usuarioMB"&gt;

Está é uma alternativa se o teu list estiver retornando os dados correto, ok.

abcs.

[/quote]
Entendi. O usuarioMB tem escopo “request” mesmo. Para guardar o ciclo estou usando o saveState do Tomahawk, assim:

&lt;t:saveState id="_bean" value="#{usuarioMB}" /&gt;Mas como não entendo bem sobre o uso dessa solução, não sei se está funcionando, rs.

Sergio, abaixo o faces-config.xml da aplicação:

&lt;faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"&gt; &lt;application&gt; &lt;view-handler&gt;com.sun.facelets.FaceletViewHandler&lt;/view-handler&gt; &lt;/application&gt; &lt;managed-bean&gt; &lt;managed-bean-name&gt;usuarioMB&lt;/managed-bean-name&gt; &lt;managed-bean-class&gt;cms.managed.UsuarioMB&lt;/managed-bean-class&gt; &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt; &lt;/managed-bean&gt; (...) &lt;/faces-config&gt;Retirei o saveState do Tomahawk e adicionei o <a4j:keepAlive/> que você mencionou, mas o erro continua o mesmo.

Cara vc fez oque te falei ? Fazer um array na mão e passar para a table.

[quote=Flavio machine]Cara vc fez oque te falei ? Fazer um array na mão e passar para a table.[/quote]Brother, fiz sim e deu certo. Setei um usuario com seus atributos preechidos numa List<E> e passei a lista como retorno ao invés do método getDao(), assim:

public List&lt;E&gt; listar(Usuario usuario) throws Exception { List&lt;E&gt; lista = new ArrayList&lt;E&gt;(); lista.add(usuario); return lista; }Assim, a página foi renderizada corretamente com a tabela apresentando o único objeto da List.
Acredito, então, que o Hibernate não está configurado corretamente na minha aplicação, porque esse método do DAO não está errado, está?
Como deveria estar minha configuração do Hibernate, considerando que os dados do driver, banco, usuário e senha do hibernate.cfg.xml estão corretos? Estou usando Hibernate com JPA.

Puts cara nunca usei o hibernate com criteria, mas se quizer te passo um esquema que eu uso aqui