0

私には2つの異なるパスがあり、これは別のパスでのみ発生します:

  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 ページに移動したときにパーティが null にならないようにしますが、ケース 2 でのみ機能します。 Signin up と createParty の間にログアウトします。UserController は managedBean であり、UsersController は SessionScoped にあります。私はまだ user という名前のセッションに User を持っていて、それを Login Filter に入れました。ケースは Welcome.xhtml---->UsersController.CreateParty() の間で同じですが、本当に奇妙なことが起こります。createParty-method で default-name を party に挿入しようとしましたが、最初のケースでは、User オブジェクトがまだ存在していても消えてしまい、User 内の Party-property だけが NULL です。ケース 2 では、ログアウトしてログインしても、まだそこにあり、すべて正常に機能しています。その原因は何ですか?私はすべてを試しましたが、私は苦しみ、欲求不満になり始めています.

ユーザーの場合:

@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 Madness 1.100%

一体何が原因なのですか、たくさん助けていただきありがとうございます!私の説明が英語であっても理解していただけると幸いです。サーミ語

4

1 に答える 1

1

この問題は、最終的にUsersオブジェクトの 2 つの異なるインスタンスが発生するために発生すると思います (ところで、名前を変更しますが、Userそれは 1 人のユーザーのみを表しますよね?)。userもう 1 つは、サインアップ時に設定されたcurrentUserのプロパティです。そうでないかどうかUserControllergetSelected()確認しているため、フィルターで設定されたものを使用していません。セッションを無効にすると、セッションがクリアされるため、「期待どおり」に機能します。currentUsernullcurrentUser

サインアップ中に行う場合は、sessionMap.put("user", user)代わりに使用することをお勧めします

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

現在ログインしているユーザーの適切なインスタンスを確実に取得できるように、必要に応じてマネージド Bean で。#{user}は必ずしも である必要はないことに注意してください@ManagedBean。EL は、属性名でリクエスト/ビュー/セッション/アプリケーション スコープをスキャンするだけです。

于 2012-06-01T14:04:20.410 に答える