Problem using Weld 2.2.8 and JSF Invalidate Session
ignacio.ayuste Dec 11, 2014 8:23 AMHi guys, i updated to the new version of Weld 2.2.8 from 2.2.6 and now i have a problem when i try to logout the application, im using RichFaces 4.5.1.
Here is my bean:
package ar.com.controller;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ConversationScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.exception.ConstraintViolationException;
import ar.com.entities.Empresa;
import ar.com.entities.Rol;
import ar.com.entities.Usuario;
import ar.com.entities.UsuarioRolEmpresa;
import ar.com.interceptors.bindings.Loggeable;
import ar.com.services.RolService;
import ar.com.services.UsuarioRolEmpresaService;
import ar.com.services.UsuarioService;
import ar.com.util.JsfUtil;
import ar.com.util.Messages;
@Named(value="usuarioController")
@ConversationScoped
@Getter @Setter
@Slf4j
public class UsuarioController extends BaseController {
private static final long serialVersionUID = 7947699776587013746L;
private Usuario usuario;
private Rol rol;
private Empresa empresa;
private UsuarioRolEmpresa usuarioRolEmpresa;
private List<Usuario> listaDeUsuarios;
private List<Rol> roles;
private List<UsuarioRolEmpresa> listaUsuariosRolesEmpresas;
private @Inject UsuarioService usuarioService;
private @Inject UsuarioRolEmpresaService usuarioRolEmpresaService;
private @Inject RolService rolService;
private @Inject SkinController skinController;
private int indiceUsuario = -1;
@PostConstruct
public void init(){
initForm();
//Cargo el combo de los roles.
roles = rolService.cargarTodos();
}
private void initForm() {
usuario = new Usuario();
usuarioRolEmpresa = new UsuarioRolEmpresa();
rol = new Rol();
listaUsuariosRolesEmpresas = new ArrayList<UsuarioRolEmpresa>();
}
@Loggeable
public String login(){
usuarioService.login(usuario,empresa);
if(JsfUtil.verifyObjectFromSession("usuario")){
Usuario user = (Usuario) JsfUtil.getObjectFromSession("usuario");
if(user.getFechaBaja() != null){
JsfUtil.addErrorMessage(Messages.getMessage(Messages.bundleName, "usuario.abm.login.baja", new Object[]{usuario.getFechaBaja()}).getDetail());
JsfUtil.removeObjectFromSession("usuario");
return "login";
}
if(user.getFechaExpiracion() != null && user.getFechaExpiracion().before(new Date())){
JsfUtil.addErrorMessage(Messages.getMessage(Messages.bundleName, "usuario.abm.login.expirado", new Object[]{}).getDetail());
JsfUtil.removeObjectFromSession("usuario");
return "login";
}
skinController.setSkin("deepMarine");
skinController.setEnableControlSkinning(true);
return "bienvenido?faces-redirect=true";
}else{
JsfUtil.addErrorMessage(Messages.getMessage(Messages.bundleName, "usuario.abm.login.invalido", new Object[]{}).getDetail());
}
return "login";
}
@Loggeable
public String logout(){
log.debug("Esta deslogueandose de la aplicacion....");
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
return "/abm/usuarios/login.xhtml?faces-redirect=true";
}
@Loggeable
public String alta(){
log.debug("COMIENZA ALTA DEL USUARIO: " + usuario);
try{
usuario.setUsuariosRolesEmpresas(listaUsuariosRolesEmpresas);
usuarioService.crear(usuario);
JsfUtil.addSuccessMessage(Messages.getMessage(Messages.bundleName, "usuario.abm.alta.mensaje.exito", new Object[]{usuario.getId()}).getDetail());
initForm();
}catch(ConstraintViolationException ex){
JsfUtil.addErrorMessage(Messages.getMessage(Messages.bundleName, "usuario.abm.alta.mensaje.duplicado", new Object[]{usuario.getUsuario()}).getDetail());
}
return "alta";
}
@Loggeable
public void agregarRol(){
usuarioRolEmpresa.setUsuario(usuario);
usuarioRolEmpresa.setEmpresa(empresa);
usuarioRolEmpresa.setRol(rol);
listaUsuariosRolesEmpresas.add(usuarioRolEmpresa);
rol = new Rol();
empresa = new Empresa();
usuarioRolEmpresa = new UsuarioRolEmpresa();
}
/* Este metodo es usado para cargar los usuarios en la pagina de baja de usuarios. */
public List<Long> cargarUsuariosPorId(){
List<Usuario> usuarios = usuarioService.cargarTodos();
List<Long> idDeUsuarios = new ArrayList<Long>();
for(Usuario u : usuarios){
idDeUsuarios.add(u.getId());
}
return idDeUsuarios;
}
/*Este metodo toma el id del paquete, busca el mismo en la base y lo setea a la segunda tabla
en la pagina de consulta.
*/
@Loggeable
public void buscarRolDelUsuario(){
log.debug("Indice Usuario: " + indiceUsuario);
if(indiceUsuario != -1 ){
usuario = listaDeUsuarios.get(indiceUsuario);
//usuario.setUsuariosRolesEmpresas(usuarioRolEmpresaService.cargarPorUsuario(usuario));
listaUsuariosRolesEmpresas = usuarioRolEmpresaService.cargarPorUsuario(usuario);
}
}
@Loggeable
public void buscarUsuarioSegunCriterios(){
log.debug("Buscando Usuario: " + usuario);
try{
listaDeUsuarios = usuarioService.buscarUsuarioByCriteria(usuario);
if(listaDeUsuarios.isEmpty()){
JsfUtil.addErrorMessage(Messages.getMessage(Messages.bundleName, "usuario.abm.consulta.mensaje.datos.invalidos", null).getDetail());
}
}catch(Exception ex){
JsfUtil.addErrorMessage(Messages.getMessage(Messages.bundleName, "usuario.abm.consulta.mensaje.error.generico", null).getDetail());
}
}
@Loggeable
public void quitarUsuario(){
log.debug("Eliminando usuario de indiceUsuario " + indiceUsuario);
log.debug("USUARIO SELECCIONADO: " + usuario);
log.debug("USUARIO A ELIMINAR DE LA LISTA: " + listaDeUsuarios.get(indiceUsuario));
String nombre =listaDeUsuarios.get(indiceUsuario).getNombre();
usuarioService.eliminar(listaDeUsuarios.get(indiceUsuario));
listaDeUsuarios.remove(indiceUsuario);
indiceUsuario = -1;
JsfUtil.addSuccessMessage(Messages.getMessage(Messages.bundleName, "usuario.abm.consulta.elimininacion.mensaje.exito", new Object[]{nombre}).getDetail());
}
@Loggeable
public void actualizar(){
usuario.setUsuariosRolesEmpresas(listaUsuariosRolesEmpresas);
usuarioService.actualizar(usuario);
JsfUtil.addSuccessMessage(Messages.getMessage(Messages.bundleName, "usuario.abm.popup.actualizacion.usuario.mensaje", new Object[]{usuario.getNombre()}).getDetail());
}
}
And right now i having this error when i call the logout method.
ADVERTENCIA: #{usuarioController.logout()}: java.lang.IllegalStateException: This InterceptionDecorationContext is no longer valid.
javax.faces.FacesException: #{usuarioController.logout()}: java.lang.IllegalStateException: This InterceptionDecorationContext is no longer valid.
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:117)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:786)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1251)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at ar.com.filter.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:35)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.faces.el.EvaluationException: java.lang.IllegalStateException: This InterceptionDecorationContext is no longer valid.
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:101)
... 30 more
Caused by: java.lang.IllegalStateException: This InterceptionDecorationContext is no longer valid.
at org.jboss.weld.bean.proxy.InterceptionDecorationContext$Stack.checkState(InterceptionDecorationContext.java:107)
at org.jboss.weld.bean.proxy.InterceptionDecorationContext$Stack.pop(InterceptionDecorationContext.java:97)
at org.jboss.weld.bean.proxy.InterceptionDecorationContext$Stack.end(InterceptionDecorationContext.java:83)
at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:77)
at ar.com.controller.UsuarioController$Proxy$_$$_WeldSubclass.logout(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:273)
at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
... 31 more
Thanks
Ignacio