【问题标题】:Instantiating a session scoped managed bean from another request scoped bean从另一个请求范围的 bean 实例化会话范围的托管 bean
【发布时间】:2011-10-25 15:28:42
【问题描述】:

我需要从另一个请求范围的 bean 实例化一个会话 bean 并为该 bean 设置值。我怎样才能从另一个 bean 中做到这一点?

实际上,我需要在用户成功登录后实例化 usersession bean,并且我需要设置该会话 bean 的 user 托管属性。

【问题讨论】:

    标签: java jsf


    【解决方案1】:

    你需要按照通常的方式手动实例化它并放入ExternalContext#getSessionMap()

    UserSession userSession = new UserSession();
    userSession.setUser(user);
    externalContext.getSessionMap().put("userSession", userSession);
    

    以正确设计的名义,我宁愿将工作委托给 JSF,只需将其注入为 @ManagedProperty

    @ManagedBean
    @RequestScoped
    public class Login {
    
        @ManagedProperty("#{userSession}")
        private UserSession userSession;
    
        public String login() {
            // ...
    
            if (user != null) {
                userSession.setUser(user);
            }
    
            // ...
        }
    
    }
    

    【讨论】:

    • 很酷.. 谢谢。只是在当前 bean 中设置来自另一个 bean 的托管属性时做一个小说明,它不是副本,而是对原始属性的引用,所以当本地属性更改时,原始属性将被更改,对吗?(这是我很困惑)
    • 不客气。是的,它只是指向相同的参考。任何更改都会来回反映。 Java 是面向对象的,你知道的。
    【解决方案2】:

    在登录时设置usersession bean 的user 属性。登录前是否实例化无关紧要,因为它的user 属性将保持为空,直到登录完成。

    并在您的请求中注入usersession bean,以处理带有@javax.inject.Inject 注释的bean。

    【讨论】:

      猜你喜欢
      • 2012-12-26
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 2012-01-20
      • 1970-01-01
      • 2013-12-30
      • 2012-06-15
      相关资源
      最近更新 更多