Managed Bean x Dao x Model

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.

Voce verificou se sua classe Usuario tem os metodos get e set da propriedade ID ?

Sim, existe. Eis a classe Usuario:

package com.mts.samds.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;

@Entity
public class Usuario {
	@Id 
	@SequenceGenerator(name="SEQ_USUARIO",sequenceName="SEQ_USUARIO")
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_USUARIO")
	@Column(name="ID_USUARIO")
	private Integer id;
	@Column(name = "LOGIN")
	private String login;
	@Column(name = "PASSWORD")
	private String password;
	@Column(name = "EMAIL")
	private String email;

	public Usuario(){

	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

}

Pessoal, desculpe, mas é que ainda não consegui resolver este problema, alguém tem alguma dica?

[quote=valdair.mts]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.[/quote]