【发布时间】:2015-06-03 21:35:55
【问题描述】:
我只想通过@RequestScoped LoginBean 设置我的用户对象一次。然后我想通过 CDI 在其他 @ManagedBean 中重用它的 setter、getter 和 isLoggedIn() 方法。
设置用户对象的请求范围类
@ManagedBean
@RequestScoped
public class LoginBean {
@ManagedProperty(value = "#{bean}")
protected Bean bean;
private String username;
private String password;
public String login() {
bean.setLoggedInUser(userDao.getUser(username));
return "index";
}
// Getters and Setters, including for the @ManagedProperty baseBean.
}
存储用户对象的SessionScoped类
@ManagedBean
@SessionScoped
public class Bean {
private User loggedInUser = null;
public boolean isLoggedIn() {
return loggedInUser != null;
}
// Getters and setters for loggedInUser
}
我想参考loggedInuser的类
@ManagedBean
@RequestScoped
public class ShowUserDetails extends Bean {
private Details details = new Details();
public void showDetails() {
if(isLoggedIn()) { // THIS ALWAYS RETURNS FALSE
// Do stuff
}
}
}
目前的解决方案
- 我可以在每个需要loggedInUser 的Backing Bean 中列出一个Bean
@ManagedProperty。这似乎是错误的,因为我在每个班级都复制粘贴了两行。 - 我可以使用
context.getApplication().evaluateExpressionGet()从 FacesContext 获取 Bean 类的实例。这允许我有一种方法来检索超类中的 Bean 实例,但这似乎也是错误的。也就是说,如果我找不到纯 CDI 解决方案,我会采用这种方法。
【问题讨论】:
-
如果您有 cdi,为什么要使用
@ManagedBean?