【问题标题】:Get access to session scoped CDI bean from request scoped CDI Bean从请求范围的 CDI Bean 访问会话范围的 CDI bean
【发布时间】:2012-01-20 16:24:18
【问题描述】:

我已经有一个会话范围的 CDI bean,它保持当前登录的用户数据。 现在,从另一个请求范围内,我想访问这个 bean 以获取一些数据。我有一些操作要做,这取决于用户登录。这是我需要的唯一信息。

如何访问它?

AccountBean.java:

@Named("accountBean")
@SessionScoped
public class AccountBean implements Serializable {
    private static final long serialVersionUID = 16472027766900196L;

    @Inject
    AccountService accountService;

    private String login;
    private String password;
    // getters and setters ommited
}

login.xhtml 的一部分:

<h:form>
    <h:panelGrid columns="2">
        #{msgs.loginPrompt}
        <h:inputText id="login" value="#{accountBean.login}" />
        #{msgs.passwordPrompt}
        <h:inputSecret id="password" value="#{accountBean.password}" />
        <h:commandButton value="#{msgs.loginButtonText}"
            action="#{accountBean.login}" />
    </h:panelGrid>
</h:form>

SearchBean.java:

@Named("searchBean")
@RequestScoped
public class SearchBean {
        @Inject AccountBean accountBean;
            // some other stuff
}

【问题讨论】:

  • 嗨@rivasket!你解决了这个案子吗?我现在正遇到这个麻烦!如果你能告诉我就好了。

标签: jsf-2 cdi


【解决方案1】:

就@Inject吧。

@Inject
private Bean bean;

请注意,这在接收 bean 的构造函数中不可用(您看,无法在未构造的实例中注入某些东西)。最早的访问点是@PostConstruct 方法。

@PostConstruct
public void init() {
    bean.doSomething();
}

【讨论】:

  • 我已经尝试过了,但没有成功。当我查看注入的 AccountBean 时,我看到它的每个字段都有空值。我在方法内部检查它,该方法由 h:commandButton 调用。会不会是这个原因?还没建好?
  • 显然您在不同的或非托管实例上设置了登录数据。如果不查看代码,很难判断您是如何设置登录数据的。
  • 我更新了我的问题。我想在 SearchBean 中登录用户登录。
  • 目前给出的代码看起来不错。 #{accountBean.login} 方法真的被调用过吗? @SessionScoped 注释来自哪个包?如果错误来自 javax.faces.bean 包而不是 javax.enterprise.context,则此问题是可以解释的。
  • 它是 javax.enterprise.context.SessionScoped。方法 login() 被调用。我可以成功登录。它可以访问网站的其他部分。我有一些子页面的菜单,其中一个我需要提供一些基于登录的数据。这是我的目标。
猜你喜欢
  • 2012-05-26
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 2014-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多