对象内的属性在会话中消失,但不是Bean本身

时间:2012-06-01 08:54:24

标签: java session jsf properties mojarra

我有两条不同的路径,这只发生在另一条路径中:

  1. SignUp.Xhtml-->SigninUpOkView-->Login.xhtml-->Welcome.xhtml-->UsersController.prepareCreateParty()--->createParty.xhtml-->UsersController.createParty()

  2. SignUp.Xhtml-->SigninUpOkView-->Login.xhtml-->Logout-->Login.xhtml-->Welcome.xhtml-->UsersController.prepareCreateParty()--->createParty.xhtml-->UsersController.createParty()

  3. 那么会发生什么:我在控制器的方法prepareCreateParty()中创建一个新的party-object并将其插入Users-object,这样当User转到CreateParty-xhtml页面时Party不为null,但它只在大小写中有效2我在Signin up和createParty之间注销。 UserController是一个managedBean,UsersController是SessionScoped。我仍然在会话中有User with name user,我把它放在Login Filter中。 Welcome.xhtml ----> UsersController.CreateParty()之间的情况是相同的,但是真的很奇怪。我尝试在createParty-method中将默认名称插入到party中,在第一种情况下,即使User对象仍然存在,它也会消失,User中的Party属性只有NULL。如果我退出并进入两个,它仍然存在,一切正常。是什么导致的?我已经尝试了一切,我开始陷入痛苦和沮丧。

    在用户中:

    @JoinColumn(name = "party_id", referencedColumnName = "party_id")
    @ManyToOne
    private Party partyId; 
    

    IN USERSCONTROLLER(SessionScoped ManagedBean):     public UsersController(Users userEntity){         this.currentUser = userEntity;     }

    public Users getSelected() {
    
            FacesContext facesContext = FacesContext.getCurrentInstance();
            HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
    
    
            if (currentUser == null) {
    
                currentUser = (Users) session.getAttribute("user");
                if(currentUser==null){
                    currentUser = new Users();
                    selectedItemIndex = -1;
                }
    
    
            }
    

    public String prepareCreateParty() {
    
        if (currentUser == null) {
            currentUser = this.getUsersFromSession();
        }
    
        Party party = new Party();
        party.setName("Testing default name of the party");
        currentUser.setPartyId(party);
        return "createParty";
    

    在CreateParty.xhtml-page:

    <p:row>
    
        <p:column> <h:outputLabel value="#{bundle.CreatePartyLabel_name}" for="name" /></p:column>
        <p:column><p:inputText id="name" value="#{usersController.selected.partyId.name}" title="#{bundle.CreatePartyTitle_name}" required="true" requiredMessage="#{bundle.CreatePartyRequiredMessage_name}"/></p:column>
        <p:column><p:tooltip for="name" showEvent="focus" hideEvent="blur" /></p:column>  
        <p:column><h:outputLabel value="&nbsp;&nbsp;"/></p:column>
    
    </p:row> 
    
    在LoginFilter.doFilter()中

    if (userPrincipal != null && session.getAttribute("user") == null) {
    
        UsersFacade test = new UsersFacade();
        Users userEntity = test.findByUsername(userPrincipal.getName());
        session.setAttribute("user", userEntity);
        UsersController userController = new UsersController(userEntity);// Unnecessary constructor call!!
    

    Glassfish 3.1.2 Mojarra 2.1.6 PrimeFaces 3.2 疯狂1.100%

    世界上有什么可以造成这种情况,我感谢你们提供了很多帮助!我希望你能解释我的解释,即使英语就是这样。 萨米

1 个答案:

答案 0 :(得分:1)

我认为这个问题是因为你最终得到了Users对象的两个不同实例(我将它重命名为User btw,它只代表一个用户,对吗?),一个在过滤器设置的会话范围中为user,另一个为注册期间设置的currentUser的{​​{1}}属性。您正在UserController检查getSelected()是否不是currentUser,因此在未使用过滤器设置的那个之后。使会话无效会清除null,因此它“按预期”工作。

如果您在注册期间执行currentUser,那么我建议改为使用

sessionMap.put("user", user)
必要时在托管bean中

,以便您可以确保拥有当前登录用户的一个和右侧实例。请注意,@ManagedProperty("#{user}") private Users user; // +setter 不一定是#{user}。 EL只是按属性名称扫描请求/视图/会话/应用程序范围。