Boa Noite pessoal,
Não estou entendendo o motivo de ocorrer o erro no caso abaixo. Eu posso(e devo?) ou não usar diretamente as classes model para interagir com o JSF.
Condição: Quando executo o método findUsuarioById com um código de ID inexistente
Esperava que: emitisse apenas a mensagem de excessão tratada no método para ObjectNotFoundException
Entretanto, aparece o erro no navegador:
rg.apache.jasper.JasperException: javax.faces.el.EvaluationException: javax.faces.el.EvaluationException: Error getting property 'id' from bean of type com.mts.samds.model.Usuario_$$_javassist_0: org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.mts.samds.model.Usuario#33]
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:346)
com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:152)
org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:216)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:107)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:245)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:137)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:214)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
arquivo jsp
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
<html>
<head>
<title>Cadastro de Usuários</title>
<style type="text/css"></style>
<link rel="stylesheet" href="styletext.css" type="text/css" />
<link rel="stylesheet" href="stylecolor.css" type="text/css" />
</head>
<body id="centerarea">
<f:view>
<center><a4j:form>
<rich:panel header="Cadastro de Usuários" style=" width : 550px;">
<h:panelGrid columns="2">
<h:outputText value="Identificador:" />
<h:inputText id="UsuIdentificador" value="#{usuario.usuario.id}"
style=" width : 70px;" />
<h:outputText value="Login: " />
<h:inputText id="UsuLogin" style=" width : 250px;"
value="#{usuario.usuario.login}" />
<h:outputText value="Password: " />
<h:inputText id="UsuPassword" style=" width : 250px;"
value="#{usuario.usuario.password}" />
<h:outputText value="e-mail: " />
<h:inputText id="UsuEmail" style=" width : 250px;"
value="#{usuario.usuario.email}" />
</h:panelGrid>
<h:panelGrid columns="5">
<h:commandButton id="btNovo" value="Novo"
action="#{usuario.newUsuario}" styleClass="submitButton"
style=" width : 70px;" />
<h:commandButton id="btBuscar" value="Buscar"
action="#{usuario.findUsuarioById}" styleClass="submitButton"
style=" width : 70px;" />
<h:commandButton id="btLimpar" value="Limpar"
action="#{usuario.clearUsuario}" styleClass="submitButton"
style=" width : 70px;" />
<h:commandButton id="btExcluir" value="Excluir"
action="#{usuario.deleteUsuario}" styleClass="submitButton"
style=" width : 70px;" />
<h:commandButton id="btSalvar" value="Salvar"
action="#{usuario.saveUsuario}" styleClass="submitButton"
style=" width : 70px;" />
</h:panelGrid>
<rich:messages id="UsuMessages">
<f:facet name="infoMarker">
<h:graphicImage id="UsuSucesso" value="/imagens/sucesso.png" />
</f:facet>
<f:facet name="errorMarker">
<h:graphicImage id="UsuErro" value="/imagens/erro.gif" />
</f:facet>
</rich:messages>
</rich:panel>
</a4j:form></center>
</f:view>
</body>
</html>
…O meu bean e seu método find:
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import com.mts.samds.dao.Dao;
import com.mts.samds.dao.DaoFactory;
import com.mts.samds.model.Usuario;
public class UsuarioMB {
private DaoFactory factory;
private Usuario usuario;
private Dao<Usuario> dao;
public UsuarioMB() {
this.usuario = new Usuario();
this.factory = new DaoFactory();
this.dao = factory.getUsuarioDao();
}
//...outros códigos
//o método find...
public void findUsuarioById() {
try {
usuario = dao.procura(usuario.getId());
} catch (org.hibernate.ObjectNotFoundException e) {
FacesMessage msgs = new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Registro não localizado.","Registro não localizado!");
FacesContext.getCurrentInstance().addMessage(null, msgs);
} catch (Exception e) {
FacesMessage msgs = new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Erro ao buscar registro.",e.getMessage());
FacesContext.getCurrentInstance().addMessage(null, msgs);
}
}
//...outros códigos
… A classe Dao
package com.mts.samds.dao;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
public class Dao<T>{
private final Session session;
private final Class<T> classe;
public Dao(Session session, Class<T> c) {
this.session = session;
this.classe = c;
}
public void adiciona(T u) {
this.session.save(u);
}
public void remove(T u) {
this.session.delete(u);
}
public void atualiza(T u) {
this.session.merge(u);
}
@SuppressWarnings("unchecked")
public List<T> listaTudo() {
return this.session.createCriteria(this.classe).list();
}
@SuppressWarnings("unchecked")
public T procura(Integer id){
return (T) session.load(this.classe, id);
}
@SuppressWarnings("unchecked")
public List<T> procuraPorPropriedade(String propertyName, String value){
Criteria busca = this.session.createCriteria(this.classe);
busca.add(Restrictions.eq(propertyName, value));
return busca.list();
}
}
…A classe Factory
package com.mts.samds.dao;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.mts.samds.model.Colaborador;
import com.mts.samds.model.Teste;
import com.mts.samds.model.Usuario;
import com.mts.samds.util.HibernateUtil;
public class DaoFactory {
private final Session session;
private Transaction transaction;
public DaoFactory() {
session = HibernateUtil.getSession();
}
public void beginTransaction() {
this.transaction = this.session.beginTransaction();
}
public void commit() {
this.transaction.commit();
this.transaction = null;
}
public boolean hasTransaction() {
return this.transaction != null;
}
public void rollback() {
this.transaction.rollback();
this.transaction = null;
}
public void close() {
this.session.close();
}
public Dao<Colaborador> getColaboradorDao() {
return new Dao<Colaborador>(this.session, Colaborador.class);
}
public Dao<Usuario> getUsuarioDao() {
return new Dao<Usuario>(this.session, Usuario.class);
}
public Dao<Teste> getTesteDao() {
return new Dao<Teste>(this.session, Teste.class);
}
}
(Estou usando o Tomcat 6.)
Obs.: Editei por percebi que não estava bem claro o problema.