修改从另一个托管bean作为托管属性访问的托管bean的私有对象属性

时间:2012-05-14 15:08:29

标签: java jsf java-ee jsf-2 managed-bean

尝试向我们的JSF 2应用程序添加一个功能,以列出活动用户(拥有活动会话),为此我决定使用应用程序范围的托管bean并存储用户列表,在每个用户列表中添加成功登录。然后我将从jsf页面访问活动用户列表(存储在应用程序范围的托管bean上) - 只有我能弄清楚如何解决以下问题:

应用程序作用域bean:AppBean.java

@ManagedBean(name = "appBean")
@ApplicationScoped
public class AppBean implements java.io.Serializable {

    private List<User> connectedUsers = new ArrayList<User>();

    public AppBean() {
    }

    public List<User> getConnectedUsers() {
        return connectedUsers;
    }

    public void setConnectedUsers(List<User> connectedUsers) {
        this.connectedUsers = connectedUsers;
    }  
}

登录Bean:

@Named(value = "loginBean")
@SessionScoped
public class LoginBean implements Serializable {

    @ManagedProperty("#{appBean}")
    private AppBean appBean;

    private User userInSession;

    public LoginBean() {
    }

    public String authenticate() {
        if (this.authClearsOut()) {
            if (appBean != null)
                appBean.getConnectedUsers().add(userInSession);
            else System.out.println("appBean = null !!!!");
            return "/next_screen.xhtml?redirect=true";
        }
        else return "/login.xhtml?authentication=failed";
    }

    public AppBean getAppBean() {
        return appBean;
    }

    public void setAppBean(AppBean appBean) {
        this.appBean = appBean;
    }
}

现在有两个问题: 1)appBean为null,除非我将LoginBean.java的第6行更改为私有AppBean appBean = new AppBean(); 2)用户userinSession永远不会添加到(List)connectedUsers。

这里有什么问题?

1 个答案:

答案 0 :(得分:1)

JSF @ManagedProperty注释仅适用于JSF @ManagedBean,而不适用于CDI @Named

更改要由JSF LoginBean管理的@ManagedBean,或将AppBean bean更改为由CDI @Named管理,然后使用@Inject代替@ManagedProperty