IllegalStateException when trying to .getSessionMap() from a Session Scoped Bean

后端 未结 1 1167
無奈伤痛
無奈伤痛 2021-01-16 06:15

I\'m new to Java and JSF. I need help with an IllegalStateException. Here\'s the scenario:

In my current project i have this Session Scoped bean for the application

1条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-01-16 07:10

    The FacesContext is stored in the HTTP request thread. You should absolutely not declare and assign it as an instance variable of an instance which lives longer than the HTTP request (and preferably also just not when it's already request based -it's bad design). The FacesContext instance is released and invalidated when the HTTP request finishes. In any subsequent HTTP request the instance is not valid anymore. There's means of an illegal state. That explains the IllegalStateException you're seeing.

    You need to remove the following line:

    private FacesContext context = FacesContext.getCurrentInstance();
    

    And fix your code to get it only threadlocal in the method block:

    Map sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
    // ...
    

    You can always assign it as a variable, but that should only be kept threadlocal:

    FacesContext context = FacesContext.getCurrentInstance();
    Map sessionMap = context.getExternalContext().getSessionMap();
    // ...
    

    Unrelated to the concrete problem, using @ManagedProperty has been easier in this particular case.

    public final class MenuBean implements Serializable {  
    
        @ManagedProperty("#{user}")
        private EUser user;
    
        // ...
    }
    

    JSF will then inject it for you.

    0 讨论(0)
提交回复
热议问题