仍然在学习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?
}
}
如何从我的应用程序中的其他区域访问此属性?谢谢你的帮助。
答案 0 :(得分:2)
您不能在EJB中使用@ManagedProperty
,并且您不应该将视图组件注入业务层组件中。 @ManagedProperty
是严格的Web层内容,只能注入Web层的JSF组件。
您的EJB应该有一个接受LoggedUser
的方法。这样,您就可以将登录的用户传递给EJB(这是Web应用程序中正确的数据流)。你现在拥有的只是转向最佳实践。
所以
provideLoggedUser(LoggedUser loggedUser)
方法UserEJB
实例调用该方法
醇>
经验法则 您的EJB不应该知道Web应用程序
答案 1 :(得分:-1)
您似乎缺少loggedUser的setter和getter。在原则它是在那里但是通常命名如下
setProperty
和
setProperty
表示名为property
的字段。注意setter和getter中字段名的大写首字母!