gpt4 book ai didi

java - 对象内部的属性在 session 中消失,但 Bean 本身不会消失

转载 作者:行者123 更新时间:2023-12-01 15:21:31 25 4
gpt4 key购买 nike

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

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

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

那么会发生什么:我在 Controller 的方法 prepareCreateParty() 中创建一个新的 party-object 并将其插入到 Users-object 中,以便当 User 转到 CreateParty-xhtml 页面时 Party 不为 null,但它仅在以下情况下才起作用2 我在 Signin up 和 createParty 之间注销。 UserController 是一个托管Bean,UserController 位于SessionScoped 上。我在 session 中仍然有名为 user 的用户,并将其放在登录过滤器中。 Welcome.xhtml---->UsersController.CreateParty() 之间的情况是相同的,但发生了一些非常奇怪的事情。我尝试在 createParty-method 中将默认名称插入到 party 中,在第一种情况下,即使 User 对象仍然存在,它也会消失,只有 User 内的 Party-property 为 NULL。在第二种情况下,当我注销并登录时,它仍然存在并且一切正常。什么会导致这种情况?我已经尝试了一切,但我开始感到痛苦和沮丧。

在用户中:

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

在 USERCONTROLLER(SessionScoped ManagedBean)中: 公共(public) UsersController(用户 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莫贾拉2.1.6PrimeFaces 3.2疯狂1.100%

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

最佳答案

我认为这个问题的原因是你最终得到了两个不同的 Users 对象实例(顺便说一句,我将其重命名为 User ,它只代表一个用户,对吧?),一个作为 session 范围中的 user,由过滤器设置,另一个作为 UserControllercurrentUser 属性,其中是在注册时设置的。您正在 getSelected() 检查 currentUser 是否不 null,因此毕竟没有使用过滤器设置的用户。使 session 无效会清除 currentUser,因此它“按预期”工作。

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

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com