在多个@ManagedBeans的代码中重用对象及其方法

时间:2015-03-30 18:27:45

标签: java jsf-2 cdi

我想通过@RequestScoped LoginBean只设置一次User对象。然后我想通过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解决方案,这就是我将采用的方法。

2 个答案:

答案 0 :(得分:0)

您担心在每个bean中添加两行代码,但您确实要编写

if(isLoggedIn()) { // THIS ALWAYS RETURNS FALSE
      // Do stuff
    }

并且很可能在bean中很多次(并且很可能也在else语句中)。

然后我肯定会使用注释和拦截器

另见

答案 1 :(得分:0)

我的解决方案是使用HttpSession存储User对象而不是具有类成员变量。这允许我有一个处理获取/设置的类,所有其他类可以简单地调用'getLoggedinUser'来检索整个对象,而不需要访问数据库。

private HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
private static final String LOGGED_IN_USER = "loggedInUser";

public User getLoggedInUser() {
    return (User) session.getAttribute(LOGGED_IN_USER);
}

public void setLoggedInUser(User user) {
    session.setAttribute(LOGGED_IN_USER, user);
}`