Olá amigos, boa noite.
Depois de alguns dias enrolado com algumas atualizações do meu sistema e resolvendo outras coisas pessoais, estou de volta. Dessa vez para demonstrar uma forma para resolver o problema quando a sessão expira. Muito de vocês já devem ter se deparado com esse tipo de problema. Ao deixar o sistema aberto por um determinado tempo configurado no web.xml, ao chamar alguma action o sistema simplesmente exibe uma mensagem semelhante à essa:
"javax.servlet.ServletException: viewId:/login.faces - View /login.faces could not be restored. javax.faces.webapp.FacesServlet.service(FacesServlet.java:249)"
Setando tempo no web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
Esse problema é ainda mais difícil resolver quando utilizado o componente Primefaces. Não foi tão trivial assim reunir algumas informações na internet e colocar realmente funcionando.
Para resolver esse tipo de problema, começamos criando um exception-handler-factory no faces-config.xml.
<factory>
<exception-handler-factory>caminhodaClasse.ViewExpiredExceptionExceptionHandlerFactory</exception-handler-factory>
</factory>
Agora vamos criar duas classes para controle dos exceptions de visão:
Classe ViewExpiredExceptionExceptionHandler.java
package br.com.notaroberto.control;
import java.io.IOException;
import java.util.Iterator;
import javax.faces.FacesException;
import javax.faces.FactoryFinder;
import javax.faces.context.ExceptionHandlerWrapper;
import javax.faces.application.ViewExpiredException;
import javax.faces.component.UIViewRoot;
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.event.ExceptionQueuedEvent;
import javax.faces.event.ExceptionQueuedEventContext;
import javax.faces.render.RenderKitFactory;
import javax.faces.render.RenderKit;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpSession;
import org.primefaces.component.PartialViewRoot;
import org.primefaces.context.RequestContextImpl;
import org.primefaces.context.RequestContext;
import org.primefaces.util.Constants;
public class ViewExpiredExceptionExceptionHandler extends ExceptionHandlerWrapper {
private ExceptionHandler wrapped;
public ViewExpiredExceptionExceptionHandler() {
}
public ViewExpiredExceptionExceptionHandler(ExceptionHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public ExceptionHandler getWrapped() {
return this.wrapped;
}
@Override
public void handle() throws FacesException {
String redirectPage = null;
for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
ExceptionQueuedEvent event = i.next();
ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
Throwable t = context.getException();
if (t instanceof ViewExpiredException) {
ViewExpiredException vee = (ViewExpiredException) t;
FacesContext fc = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fc.getExternalContext().getSession(true);
try {
// Push some useful stuff to the request scope for use in the page
session.setAttribute("currentViewId", vee.getViewId());
// Para qual página será redirecionada caso a sessão expire, no meu caso retorna à principal
redirectPage = "/app/index.xhtml";
} finally {
i.remove();
}
// Redireciona a página
doRedirect(fc, redirectPage);
// Importante, colocar a variável de controle exibeDialog na sessão para posteriormente ser capturada nos managedBean e ser exibido um dialog na respectiva página xhtml.
session.setAttribute("exibeDialog", true);
}
}
// At this point, the queue will not contain any ViewExpiredEvents.
// Therefore, let the parent handle them.
getWrapped().handle();
}
public void doRedirect(FacesContext fc, String redirectPage) throws FacesException {
ExternalContext ec = fc.getExternalContext();
try {
// workaround for PrimeFaces
new RequestContextImpl(ec);
if (ec.getRequestParameterMap().containsKey(Constants.PARTIAL_PROCESS_PARAM) && !ec.getRequestParameterMap().get(Constants.PARTIAL_PROCESS_PARAM).equals("@all")) {
fc.setViewRoot(new PartialViewRoot(new UIViewRoot()));
}
// fix for renderer kit (Mojarra's and PrimeFaces's ajax redirect)
if ((RequestContext.getCurrentInstance().isAjaxRequest() || fc.getPartialViewContext().isPartialRequest()) && fc.getResponseWriter() == null && fc.getRenderKit() == null) {
ServletResponse response = (ServletResponse) ec.getResponse();
ServletRequest request = (ServletRequest) ec.getRequest();
response.setCharacterEncoding(request.getCharacterEncoding());
RenderKitFactory factory = (RenderKitFactory) FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
RenderKit renderKit = factory.getRenderKit(fc, fc.getApplication().getViewHandler().calculateRenderKitId(fc));
ResponseWriter responseWriter = renderKit.createResponseWriter(response.getWriter(), null, request.getCharacterEncoding());
fc.setResponseWriter(responseWriter);
}
ec.redirect(ec.getRequestContextPath() + (redirectPage != null ? redirectPage : ""));
} catch (IOException e) {
System.out.println("Redirect to the specified page '" + redirectPage + "' failed");
throw new FacesException(e);
}
}
}
Classe ViewExpiredExceptionExceptionHandlerFactory.java
package br.com.notaroberto.control;
import javax.faces.context.ExceptionHandlerFactory;
import javax.faces.context.ExceptionHandler;
public class ViewExpiredExceptionExceptionHandlerFactory extends ExceptionHandlerFactory {
private ExceptionHandlerFactory parent;
public ViewExpiredExceptionExceptionHandlerFactory(ExceptionHandlerFactory parent) {
this.parent = parent;
}
@Override
public ExceptionHandler getExceptionHandler() {
ExceptionHandler result = parent.getExceptionHandler();
result = new ViewExpiredExceptionExceptionHandler(result);
return result;
}
}
Como configuramos na classe acima, caso ocorra alguma exceção na visão, é redirecionada para a página index, e esta está linkada ao ManagedBean AutenticacaoController.java, segue o trecho da mesma abaixo:
package br.com.notaroberto.controller;
import br.com.notaroberto.dao.UsuarioDAO;
import br.com.notaroberto.model.Usuario;
import br.com.notaroberto.util.Constantes;
import br.com.notaroberto.util.JsfUtil;
import java.io.Serializable;
import java.util.ResourceBundle;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
*
* @author Lessandro
*/
@ManagedBean(name = "autenticacaoController")
@ViewScoped
public class AutenticacaoController implements Serializable {
private static final long serialVersionUID = 483391080902399125L;
private Usuario usuario, usuarioAutenticado;
private UsuarioDAO usuarioDAO;
// Variavel responsavel por fazer o controle se será exibido o dialog que a sessao expirou
private boolean exibeDialog;
private HttpSession session;
@PostConstruct
public void init() {
/* Chamado só quando o managed bean é colocado no escopo view,
e não a cada requisição como acontecia com o escopo request */
usuario = new Usuario();
}
@PreDestroy
public void destroy() {
/* chamado quando outra view for chamada através do UIViewRoot.setViewId(String viewId) */
}
public Usuario getUsuario() {
return usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
public Usuario getUsuarioAutenticado() {
recuperaSessao();
if (session.getAttribute("usuarioAutenticado") != null) {
usuarioAutenticado = (Usuario) session.getAttribute("usuarioAutenticado");
}
return usuarioAutenticado;
}
public void setUsuarioAutenticado(Usuario usuarioAutenticado) {
this.usuarioAutenticado = usuarioAutenticado;
}
// get linkado à uma tag rendered na pagina index.xhtml, responsável por capturar a variável colocada na sessão na classe ViewExpiredExceptionExceptionHandler e caso tenha recebido valor true, exibe o dialog que a sessão expirou
public boolean isExibeDialog() {
recuperaSessao();
if (session.getAttribute("exibeDialog") != null) {
exibeDialog = (Boolean) session.getAttribute("exibeDialog");
}
return exibeDialog;
}
public void setExibeDialog(boolean exibeDialog) {
this.exibeDialog = exibeDialog;
}
public String autenticaUsuario() {
try {
usuarioDAO = new UsuarioDAO();
usuarioAutenticado = usuarioDAO.buscaLoginSenha(usuario.getDsLogin(), usuario.getDsSenha());
if (usuarioAutenticado == null) {
JsfUtil.addErrorMessage("iphMensagem", ResourceBundle.getBundle("/message").getString("usuario.naoEncontrado"));
} else {
FacesContext ctx = FacesContext.getCurrentInstance();
session = (HttpSession) ctx.getExternalContext().getSession(false);
session.setAttribute("usuarioAutenticado", usuarioAutenticado);
System.out.println(session.getId());
return Constantes.URL_MENU_HOME;
}
} catch (Exception e) {
JsfUtil.addErrorMessage("iphMensagem", ResourceBundle.getBundle("/message").getString("mensagem.conexao.erro"));
}
return "";
}
public void encerraSessao() {
try {
FacesContext ctx = FacesContext.getCurrentInstance();
session = (HttpSession) ctx.getExternalContext().getSession(false);
session.setAttribute("usuarioAutenticado", null);
ctx.getExternalContext().redirect(ctx.getExternalContext().getRequestContextPath() + "/app" + Constantes.PAGINA_INDEX);
session.invalidate();
} catch (Exception e) {
}
}
public void recuperaSessao() {
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest) facesContext.getExternalContext().getRequest();
session = request.getSession();
}
public void fechaModal() {
recuperaSessao();
session.setAttribute("exibeDialog", false);
}
}
Agora um fragmento da página index com a tag responsável por renderizar ou não o dialog que exibe a mensagem que a sessão expirou.
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.prime.com.tr/ui">
<ui:composition template="/resources/template.xhtml">
<ui:define name="login">
<ui:include src="/resources/login.xhtml" />
</ui:define>
<ui:define name="centro">
<p:outputPanel id="oplDialog" layout="block">
<p:dialog id="dlgMsg" header="#{msg['modalPanel.msgAlerta']}"
position="center" minWidth="300" width="300" visible="true"
resizable="false" modal="true" rendered="#{autenticacaoController.exibeDialog}">
<h:panelGrid columns="1" cellspacing="5px">
<h:outputLabel id="oplMensagem" value="#{msg['mensagem.expirouSessao']}" styleClass="fonteAlerta" />
<p:commandButton id="cbtOk" value="#{msg['botao.ok']}" immediate="true"
ajax="false" action="#{autenticacaoController.fechaModal}" update="oplDialog, pgrLogin" />
</h:panelGrid>
</p:dialog>
</p:outputPanel>
</ui:define>
</ui:composition>
</html>
Quando ocorre uma exception e a sessão é expirada, a página é redirecionada para index.xhtml, o atributo exibeDialog do managedBean da página index recebe true, sendo exibido um dialog informando a questão. Neste dialog temos um botão OK, onde acionado, este fecha o dialog e seta pra variavel de sessão o valor false.
À pedidos foram adicionadas as demais classes externas utilizadas.
JSFUtil.java
package br.com.notaroberto.util;
//~--- JDK imports ------------------------------------------------------------
import java.lang.reflect.Method;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
public class JsfUtil {
public static void addErrorMessageExcecao(Exception ex, String defaultMsg) {
String msg = ex.getLocalizedMessage();
if ((msg != null) && (msg.length() > 0)) {
addErrorMessage(null, msg);
} else {
addErrorMessage(null, defaultMsg);
}
}
public static void addErrorMessages(List<String> messages) {
for (String message : messages) {
addErrorMessage(null, message);
}
}
public static void addErrorMessage(String idComponente, String msg) {
FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg);
FacesContext.getCurrentInstance().addMessage(idComponente, facesMsg);
}
public static void addSuccessMessage(String idComponente, String msg) {
FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg);
FacesContext.getCurrentInstance().addMessage("idComponente", facesMsg);
}
public static String getRequestParameter(String key) {
return FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(key);
}
public static Object getObjectFromRequestParameter(String requestParameterName, Converter converter,
UIComponent component) {
String theId = JsfUtil.getRequestParameter(requestParameterName);
return converter.getAsObject(FacesContext.getCurrentInstance(), component, theId);
}
public static Object getMethod(Object obj, String name) throws Exception {
Method createMethod = obj.getClass().getMethod(name, new Class[0]);
return createMethod.invoke(obj, new Object[0]);
}
public static void setAttribute(String valorObjeto, Object tipoObjeto) {
FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put(valorObjeto, tipoObjeto);
}
public static Object getAttribute(String valorObjeto) {
return FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(valorObjeto);
}
}
UsuarioDAO.java
package br.com.notaroberto.dao;
//~--- non-JDK imports --------------------------------------------------------
import br.com.notaroberto.model.Usuario;
//~--- JDK imports ------------------------------------------------------------
import br.com.notaroberto.util.CriptografaSenha;
import br.com.notaroberto.util.HibernateUtil;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;
/**
*
* @author Lessandro
*/
public class UsuarioDAO {
public void salva(Usuario usuario) {
Session session = HibernateUtil.getSessao();
HibernateUtil.inicializaTransacao();
usuario.setDsSenha(CriptografaSenha.criptografar(usuario.getDsSenha()));
session.save(usuario);
HibernateUtil.aplicaTransacao();
HibernateUtil.fechaSessao();
}
public void altera(Usuario usuario) {
Session session = HibernateUtil.getSessao();
HibernateUtil.inicializaTransacao();
/* Senha informada nao esta criptografada, entao criptografa */
if (usuario.getDsSenha().length() < 32) {
usuario.setDsSenha(CriptografaSenha.criptografar(usuario.getDsSenha()));
}
session.update(usuario);
HibernateUtil.aplicaTransacao();
HibernateUtil.fechaSessao();
}
public void exclui(Usuario usuario) {
Session session = HibernateUtil.getSessao();
HibernateUtil.inicializaTransacao();
session.delete(usuario);
HibernateUtil.aplicaTransacao();
HibernateUtil.fechaSessao();
}
public Usuario buscaPeloID(int id) {
Usuario usuario = (Usuario) HibernateUtil.getSessao().get(Usuario.class, id);
HibernateUtil.fechaSessao();
return usuario;
}
@SuppressWarnings("unchecked")
public List<Usuario> buscaTodos() {
Criteria criteria = HibernateUtil.getSessao().createCriteria(Usuario.class);
List<Usuario> usuarios = criteria.list();
HibernateUtil.fechaSessao();
return usuarios;
}
public Usuario buscaLoginSenha(String usuario, String senha) {
Session session = HibernateUtil.getSessao();
Criteria criteria = session.createCriteria(Usuario.class);
HibernateUtil.inicializaTransacao();
criteria.add(Expression.eq("dsLogin", usuario));
criteria.add(Expression.eq("dsSenha", CriptografaSenha.criptografar(senha)));
Usuario usuarioRecuperado = (Usuario) criteria.uniqueResult();
HibernateUtil.fechaSessao();
return usuarioRecuperado;
}
}
Constantes.java
package br.com.notaroberto.util;
/**
*
* @author Lessandro
*/
public class Constantes {
/* Opcoes Gerais */
public static final String PAGINA_LOGIN = "/login.xhtml";
public static final String PAGINA_INDEX = "/index.xhtml";
public static final String PAGINA_EXIBIR_PERFIL = "exibirPerfis.xhtml";
public static final String PAGINA_EXIBIR_USUARIO = "exibirUsuarios.xhtml";
public static final Integer CLIENTE_TIPO_PESSOA_FISICA = 0;
public static final Integer CLIENTE_TIPO_PESSOA_JURIDICA = 1;
public static final Integer ID_PERFIL_ADMINISTRADOR = 1;
public static final String MENU_CADASTRO = "Cadastro";
public static final String MENU_HOME = "Home...";
public static final String MENU_USUARIO = "Usuario...";
public static final String MENU_PERFIL = "Perfil...";
public static final String MENU_CLIENTE = "Cliente...";
public static final String MENU_ESTOQUE = "Estoque...";
public static final String MENU_FORMAPGTO = "Forma de Pagamento...";
public static final String MENU_PEDIDO = "Pedido...";
public static final String MENU_FORNECEDOR = "Fornecedor...";
public static final String MENU_PRODUTO = "Produto...";
public static final String MENU_ENCERRARSESSAO = "Encerrar Sessão...";
public static final String MENU_SAIR = "Sair";
public static final String URL_MENU_HOME = "/index?faces-redirect=true";
public static final String URL_MENU_USUARIO = "/jsf/usuario/exibirUsuarios?faces-redirect=true";
public static final String URL_MENU_PERFIL = "/jsf/perfil/exibirPerfis?faces-redirect=true";
public static final String URL_MENU_CLIENTE = "/jsf/cliente/exibirClientes?faces-redirect=true";
public static final String URL_MENU_ESTOQUE = "/jsf/estoque/exibirEstoques?faces-redirect=true";
public static final String URL_MENU_FORMAPGTO = "/jsf/formaPgto/exibirFormasPgto?faces-redirect=true";
public static final String URL_MENU_PEDIDO = "/jsf/pedido/exibirPedidos?faces-redirect=true";
public static final String URL_MENU_FORNECEDOR = "/jsf/fornecedor/exibirFornecedores?faces-redirect=true";
public static final String URL_MENU_PRODUTO = "/jsf/produto/exibirProdutos?faces-redirect=true";
public static final String ACAO_MENU_ENCERRARSESSAO = "#{autenticacaoController.encerraSessao}";
}
Usuario.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.notaroberto.model;
//~--- JDK imports ------------------------------------------------------------
import java.io.Serializable;
import java.math.BigInteger;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
/**
*
* @author Lessandro
*/
@Entity
@Table(name = "tb_usuario", catalog = "autopecas", schema = "", uniqueConstraints = {
@UniqueConstraint(columnNames = {"NM_USUARIO"})})
public class Usuario implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID_USUARIO", nullable = false)
private Integer idUsuario;
@Column(name = "DS_BAIRRO", nullable = false, length = 50)
private String dsBairro;
@Column(name = "DS_CIDADE", nullable = false, length = 50)
private String dsCidade;
@Column(name = "DS_ESTADO", nullable = false, length = 2)
private String dsEstado;
@Column(name = "DS_LOGIN", nullable = false, length = 20)
private String dsLogin;
@Column(name = "DS_RUA", nullable = false, length = 100)
private String dsRua;
@Column(name = "DS_SENHA", nullable = false, length = 32)
private String dsSenha;
@Column(name = "NM_USUARIO", nullable = false, length = 100)
private String nmUsuario;
@Column(name = "NU_CEP")
private Integer nuCep;
@Column(name = "NU_CPF", nullable = false, length = 11)
private String nuCpf;
@Column(name = "NU_TEL_FIXO", columnDefinition="bigint", nullable = false)
private BigInteger nuTelFixo;
@Column(name = "NU_TEL_CONTATO", columnDefinition="bigint", nullable = false)
private BigInteger nuTelContato;
@Column(name = "NU_LOCAL", nullable = false)
private int nuLocal;
@JoinColumn(name = "ID_PERFIL", referencedColumnName = "ID_PERFIL", nullable = false)
@ManyToOne(optional = false)
private Perfil perfil;
public Usuario() {
}
public Usuario(Integer idUsuario) {
this.idUsuario = idUsuario;
}
public Integer getIdUsuario() {
return idUsuario;
}
public void setIdUsuario(Integer idUsuario) {
this.idUsuario = idUsuario;
}
public String getNmUsuario() {
return nmUsuario;
}
public void setNmUsuario(String nmUsuario) {
this.nmUsuario = nmUsuario;
}
public String getDsRua() {
return dsRua;
}
public void setDsRua(String dsRua) {
this.dsRua = dsRua;
}
public int getNuLocal() {
return nuLocal;
}
public void setNuLocal(int nuLocal) {
this.nuLocal = nuLocal;
}
public String getDsBairro() {
return dsBairro;
}
public void setDsBairro(String dsBairro) {
this.dsBairro = dsBairro;
}
public Integer getNuCep() {
return nuCep;
}
public void setNuCep(Integer nuCep) {
this.nuCep = nuCep;
}
public String getDsCidade() {
return dsCidade;
}
public void setDsCidade(String dsCidade) {
this.dsCidade = dsCidade;
}
public String getDsEstado() {
return dsEstado;
}
public void setDsEstado(String dsEstado) {
this.dsEstado = dsEstado;
}
public String getDsLogin() {
return dsLogin;
}
public void setDsLogin(String dsLogin) {
this.dsLogin = dsLogin;
}
public String getDsSenha() {
return dsSenha;
}
public void setDsSenha(String dsSenha) {
this.dsSenha = dsSenha;
}
public Perfil getPerfil() {
return perfil;
}
public void setPerfil(Perfil perfil) {
this.perfil = perfil;
}
public String getNuCpf() {
return nuCpf;
}
public void setNuCpf(String nuCpf) {
this.nuCpf = nuCpf;
}
public BigInteger getNuTelFixo() {
return nuTelFixo;
}
public void setNuTelFixo(BigInteger nuTelFixo) {
this.nuTelFixo = nuTelFixo;
}
public BigInteger getNuTelContato() {
return nuTelContato;
}
public void setNuTelContato(BigInteger nuTelContato) {
this.nuTelContato = nuTelContato;
}
@Override
public int hashCode() {
int hash = 0;
hash += ((idUsuario != null)
? idUsuario.hashCode()
: 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Usuario)) {
return false;
}
Usuario other = (Usuario) object;
if (((this.idUsuario == null) && (other.idUsuario != null))
|| ((this.idUsuario != null) && !this.idUsuario.equals(other.idUsuario))) {
return false;
}
return true;
}
@Override
public String toString() {
return "br.com.notaroberto.model.Usuario[idUsuario=" + idUsuario + "]";
}
}
CriptografaSenha.java
package br.com.notaroberto.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class CriptografaSenha {
private static MessageDigest md = null;
/**
* Metodo estatico para a geracao do algoritmo de criptografia.
*/
static {
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException ex) {
ex.printStackTrace();
}
}
/**
* Criptografa a senha.
*
* @param senha
* String A senha normal.
* @return String A senha criptografada.
*/
public static String criptografar(String senha) {
if (md != null) {
return new String(hexCodes(md.digest(senha.getBytes())));
}
return null;
}
private static char[] hexCodes(byte[] text) {
char[] hexOutput = new char[text.length * 2];
String hexString;
for (int i = 0; i < text.length; i++) {
hexString = "00" + Integer.toHexString(text[i]);
hexString.toUpperCase().getChars(hexString.length() - 2,
hexString.length(), hexOutput, i * 2);
}
return hexOutput;
}
}
HibernateUtil.java
package br.com.notaroberto.util;
import br.com.notaroberto.model.Cliente;
import br.com.notaroberto.model.Estoque;
import br.com.notaroberto.model.FormaPgto;
import br.com.notaroberto.model.Fornecedor;
import br.com.notaroberto.model.Pedido;
import br.com.notaroberto.model.PedidoProduto;
import br.com.notaroberto.model.Perfil;
import br.com.notaroberto.model.Produto;
import br.com.notaroberto.model.Usuario;
import com.mysql.jdbc.Connection;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.Hibernate;
public class HibernateUtil {
private static SessionFactory sessionFactory;
private static AnnotationConfiguration configuracao;
private static ThreadLocal<Session> threadSession = new ThreadLocal<Session>();
private static Logger log = Logger.getLogger(HibernateUtil.class);
public static void inicializa() {
try {
sessionFactory = getConfiguracao().buildSessionFactory();
log.info("Hibernate Inicializado.");
} catch (Throwable e) {
log.error("Falha na inicialização do Hibernate: " + e);
}
}
public static AnnotationConfiguration getConfiguracao() {
if (configuracao == null) {
configuracao = new AnnotationConfiguration();
/* Classes devem ser informadas aqui para anotacao */
configuracao.addAnnotatedClass(Perfil.class);
configuracao.addAnnotatedClass(Usuario.class);
configuracao.addAnnotatedClass(Cliente.class);
configuracao.addAnnotatedClass(Estoque.class);
configuracao.addAnnotatedClass(Fornecedor.class);
configuracao.addAnnotatedClass(FormaPgto.class);
configuracao.addAnnotatedClass(Produto.class);
configuracao.addAnnotatedClass(Pedido.class);
configuracao.addAnnotatedClass(PedidoProduto.class);
}
return configuracao;
}
public static void setConfiguration(AnnotationConfiguration cfg) {
HibernateUtil.configuracao = cfg;
}
public static void reinicializa() {
fechaSessao();
inicializa();
getSessao();
}
/**
* Inicializa as propriedades de um objeto persistido.
*/
public static void initializeProperties(Object obj) {
try {
if (!Hibernate.isInitialized(obj)) {
Hibernate.initialize(obj);
}
} catch (Exception e) {
log.error("Falha ao inicializar as propriedades do objeto: " + e);
}
}
/**
* Atualiza um objeto persistido.
*/
public static void atualizaObjeto(Object obj) {
try {
Session s = HibernateUtil.getSessao();
s.refresh(obj);
} catch (Exception e) {
log.error("Falha ao atualizar o objeto: " + e);
}
}
/**
* Limpa a session corrente.
*/
public static void limpaSessao() {
try {
Session s = HibernateUtil.getSessao();
s.clear();
} catch (Exception e) {
log.error("Falha ao limpar a sessão: " + e);
}
}
/**
* Inicializa transacao.
*/
public static Connection recuperaConexao() {
Connection con = null;
try {
con = (Connection) HibernateUtil.getConfiguracao().buildSettings().getConnectionProvider().getConnection();
} catch (Throwable e) {
log.error("Falha ao recuperar a conexão: " + e);
}
return con;
}
/**
* Inicializa transacao.
*/
public static void inicializaTransacao() {
try {
Session s = HibernateUtil.getSessao();
s.beginTransaction();
} catch (Throwable e) {
log.error("Falha ao inicializar a transação: " + e);
}
}
/**
* Aplica transacao.
*/
public static void aplicaTransacao() {
try {
Session s = HibernateUtil.getSessao();
s.getTransaction().commit();
} catch (Exception e) {
log.error("Falha ao aplicar a transação: " + e);
}
}
/**
* Retorna uma Session existente, ou então abre uma nova e associa a ThreadLocal.
* @return uma sessão do Hibernate
*/
public static Session getSessao() {
Session s = null;
try {
if (sessionFactory == null) {
inicializa();
fechaSessao();
}
s = (Session) threadSession.get();
if (s == null) {
s = sessionFactory.openSession();
threadSession.set(s);
}
} catch (Exception e) {
log.error("Falha ao recuperar a sessão: " + e);
}
return s;
}
/**
* Fecha a Session associada a ThreadLocal.
*/
public static void fechaSessao() {
try {
Session s = (Session) threadSession.get();
threadSession.set(null);
if (s != null && s.isOpen()) {
s.close();
}
} catch (Exception e) {
log.error("Falha ao fechar a sessão: " + e);
}
}
}
Para versões posteriores ao Primefaces 2.2, segue alguns links que abordam o assunto:
http://weblogs.java.net/blog/edburns/archive/2009/09/03/dealing-gracefully-viewexpiredexception-jsf2 http://www.gregbugaj.com/?p=164 http://javalabor.blogspot.com.br/2011/09/jsf-2-global-exception-handling.htmlAdding global exception handling using JSF 2.x ExceptionHandler
Espero que tenha ajudado,
Grande abraço a todos,
Até a próxima 🙂