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