访问会话Bean属性/注入会话Bean

时间:2014-12-01 00:44:04

标签: jsf jsf-2 ejb

仍然在学习JSF和Java,并且无法理解如何访问会话bean属性。 我有一个LoggedUser会话bean,用于设置登录的用户(使用登录方法)。

@ManagedBean(name="loggedUser")
@Stateless
@LocalBean
@SessionScoped
public class LoggedUser {

    @EJB
    UserEJB userEJB;
    @PersistenceContext
    private EntityManager em;
    private UserEntity loggedUser;
    private String loginUserName;
    private String loginPassword;

    public LoggedUser() {}

    public UserEntity getLoggedUser() {
        return loggedUser;
    }

    public void setLoggedUser(UserEntity loggedUser) {
        this.loggedUser = loggedUser;
    }

    public String authenticate() {
        if (loggedUser == null) {
            return "login.xhtml";
        } else {
            return "";
        }
    }

    public String login() {
        if (userEJB.validateLogin(loginUserName, loginPassword)) {
            setLoggedUser(userEJB.fetchUser(loginUserName));
            return "index.xhtml";
        }
        return "";
    }

    public String getLoginUserName() {
        return loginUserName;
    }

    public void setLoginUserName(String loginUserName) {
        this.loginUserName = loginUserName;
    }

    public String getLoginPassword() {
        return loginPassword;
    }

    public void setLoginPassword(String loginPassword) {
        this.loginPassword = loginPassword;
    }
}

我希望能够从应用程序的其他区域查看已登录的用户。我认为我注入错误是因为当我在一个不同的bean时,例如,当使用例如某些东西时,loggedUser总是为空的。

@Stateless
@LocalBean
public class HistoryEJB {

    @PersistenceContext
    EntityManager em;
    @ManagedProperty(value = "#{loggedUser}")
    private LoggedUser loggedUser;

    public LoggedUser getLoggedUser() {
        return loggedUser;
    }

    public void setLoggedUser(LoggedUser loggedUser) {
        this.loggedUser = loggedUser;
    }

    public void testLoggedUser() {
        loggedUser.getLoggedUser();
        // Just an example but would be null here - why?
    }
}

如何从我的应用程序中的其他区域访问此属性?谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

您不能在EJB中使用@ManagedProperty,并且您不应该将视图组件注入业务层组件中。 @ManagedProperty是严格的Web层内容,只能注入Web层的JSF组件。

您的EJB应该有一个接受LoggedUser的方法。这样,您就可以将登录的用户传递给EJB(这是Web应用程序中正确的数据流)。你现在拥有的只是转向最佳实践。

所以

  1. 向EJB添加provideLoggedUser(LoggedUser loggedUser)方法
  2. 从托管bean
  3. 中的UserEJB实例调用该方法

    经验法则 您的EJB不应该知道Web应用程序

答案 1 :(得分:-1)

您似乎缺少loggedUser的setter和getter。在原则它是在那里但是通常命名如下

setProperty

setProperty

表示名为property的字段。注意setter和getter中字段名的大写首字母!