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<E> 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<T> listar(Class classT) {
Session session = null;
try {
session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(classT);
return (List<T>) criteria.list();
} catch (HibernateException ex) {
throw ex;
} finally {
HibernateUtil.closeSession(session);
}
}
O arquivo “hibernate.cfg.xml” está assim:
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/ceresgog_ceresgo</property>
<property name="hibernate.connection.username">ceresgog_ceresgo</property>
<property name="hibernate.connection.password">ceresgoadmin</property>
</session-factory>
</hibernate-configuration>
E o arquivo persistence.xml, assim:
<persistence-unit name="pref-ceres-painelPU" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>pref-ceres-jndi</jta-data-source>
<properties>
</properties>
</persistence-unit>
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?