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


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


因此发生了什么:我在控制器的方法prepareCreateParty()中创建了一个新的party对象,并将其插入到Users对象中,以便当User转到CreateParty-xhtml页面时Party不为null,但是它仅在情况2中有效在注册和createParty之间注销。 UserController是一个ManagedBean,而UsersController在SessionScoped上。我仍在会话中使用名称为user的User,并将其放在Login Filter中。在Welcome.xhtml ----> UsersController.CreateParty()之间,情况是相同的,但是确实发生了一些奇怪的事情。我试图在defaultParty方法中为party插入默认名称,在第一种情况下,即使User对象仍然存在,它也消失了,只有User内部的Party-property为NULL。在第二种情况下,当我注销并登录时,它仍然存在,并且一切正常。是什么原因造成的?我已经尝试了一切,并且开始感到痛苦和沮丧。

在用户中:

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


在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!!


玻璃鱼3.1.2
Mojarra 2.1.6
PrimeFaces 3.2
疯狂1.100%

到底是什么原因引起的,非常感谢您的帮助!我希望你能弄清楚我的解释,即使是英文也是如此。
佐美

最佳答案

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

如果您在注册过程中执行sessionMap.put("user", user),那么我建议改用

@ManagedProperty("#{user}")
private Users user; // +setter


在受管Bean中(必要时),以便确保拥有当前登录用户的一个和正确的实例。请注意,#{user}不一定是@ManagedBean。 EL只是通过属性名称扫描请求/视图/会话/应用程序范围。

关于java - 对象内部的属性在 session 中消失,但Bean本身不消失,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10847244/

10-14 03:36