0

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

  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()

那么会发生什么:我在控制器的方法 prepareCreateParty() 中创建了一个新的派对对象并将其插入到用户对象中,这样当用户转到 CreateParty-xhtml 页面时,派对不为空,但它仅在我的情况 2 中工作在 Signin up 和 createParty 之间注销。UserController 是 managedBean 并且 UsersController 在 SessionScoped 上。我仍然在会话中使用名称为用户的用户,并将其放在登录过滤器中。Welcome.xhtml---->UsersController.CreateParty() 之间的情况相同,但发生了一些非常奇怪的事情。我尝试在 createParty-method 中将默认名称插入派对,在第一种情况下,即使用户对象仍然存在,它也会消失,只有用户内的派对属性为 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 页面中:

<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%

到底是什么原因造成的,非常感谢您的帮助!我希望你能理解我的解释,即使英语是这样的。萨米人

4

1 回答 1

1

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

如果您sessionMap.put("user", user)在注册期间进行,那么我建议您改用

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

必要时在托管 bean 中,这样您就可以确保拥有当前登录用户的唯一且正确的实例。请注意,#{user}不一定需要是@ManagedBean. EL 只是通过属性名称扫描请求/视图/会话/应用程序范围。

于 2012-06-01T14:04:20.410 回答