当前位置: 首页 > 知识库问答 >
问题:

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

汪理
2023-03-14

我想通过LoginBean设置我的User对象仅一次。然后我想通过CDI在其他@ManagedBean中重用它的setters、getters和一个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.

}
@ManagedBean
@SessionScoped
public class Bean {

    private User loggedInUser = null;

    public boolean isLoggedIn() {
        return loggedInUser != null;
    }

    // Getters and setters for 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的支持Bean中列出一个Bean@ManagedProperty。这似乎是错误的,因为我在每节课上都要复制粘贴两行
  • 我可以使用context从FacesContext获取Bean类的实例。getApplication()。evaluateExpressionGet()。这允许我有一个方法来检索超类中的Bean实例,但这似乎也是错误的。也就是说,如果我无法找到纯CDI解决方案,我将采用这种方法

共有2个答案

杨赞
2023-03-14

我的解决方案是使用HttpSession来存储用户对象,而不是使用类成员变量。这允许我有一个类来处理获取/设置,而所有其他类都可以简单地调用“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);
}`
邴俊友
2023-03-14

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

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

而且很可能在bean中多次出现(也很可能是其他语句中的内容)。

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

另见

  • https://code.google.com/p/jee6-cdi/source/browse/tutorial/cdi-aop-example/src/main/java/org/cdi/advocacy/security/
  • http://balusc.blogspot.nl/2013/01/apache-shiro-is-it-ready-for-java-ee-6.html
 类似资料:
  • 如何迭代对象及其子对象的属性?我在中使用了,但无法获取歌曲信息:/

  • 我不相信为什么下面的陈述是有效的并且不会引发异常。 somelist是空的,首先检查if()是有效的,但是如何获取空引用的大小呢?这不违法吗? 还是它是这样工作的: 仅当条件1为真时,检查条件2? 因为我不相信,虽然我通过编写测试代码来确认。我总是喜欢下面: 请帮助我理解逻辑

  • 我在我的rdbms系统的顶部有spring boot的基础API,我做所有的操作,但是当它是关于从系统中选择数据时,我的GET映射endpoint有许多检查来决定我应该调用哪个findbyAttributes方法。 我创建了多个存储库方法,如findbyId、findbyIdAndName、findByIdandNameAndAge。 但是考虑一下我的场景,我在表中有大约30列,最终用户可能希望在

  • 如果重写finalize()并引用一个对象会发生什么。那个对象会被垃圾回收吗?从内存中清除该对象的另一种方法是什么?

  • 超类Student包含:一个构造函数,它接受与学生就读的学校名称相对应的字符串;一个toString方法,它返回“Student at X”,其中X是学生就读的学校名称。 教师说明:您只编写了子类。在它中,您将有一个构造函数(它有一个参数-一个字符串),它将调用超类的构造函数,并将这个参数传递给它。它还将通过返回“high school”,然后返回超类的tostring方法中返回的内容来覆盖tos