【问题标题】:Access Session Bean Property/Inject Session Bean访问会话 Bean 属性/注入会话 Bean
【发布时间】:2014-12-01 00:44:04
【问题描述】:

仍在学习 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?
    }
}

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

【问题讨论】:

    标签: jsf jsf-2 ejb


    【解决方案1】:

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

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

    所以

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

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

    【讨论】:

    • 感谢您的建议。有道理!
    【解决方案2】:

    您似乎缺少loggedUser 的setter 和getter。原则上它在那里,但约定如下命名它

    setProperty
    

    setProperty
    

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

    【讨论】:

    • 啊,是的,我忘了把它们改回来。这不是我遇到这个问题的原因吗?
    • 我猜你得到了一个例外,因为它不能被设置。如果没有,我会感到惊讶。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2011-12-29
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    相关资源
    最近更新 更多