0

CDI を使用して Bean に注釈を付けます。SessionManager と呼ばれる 1 つの Bean は、次の宣言を使用してログインしたユーザー情報を保持します。

import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import javax.ejb.Stateful;

@Stateful
@Named
@SessionScoped
public class SessionManagerImpl implements SessionManager, Serializable {
    ...
    public UserDto getLoginedUser() {
        ...
    }
}

もう 1 つは、次のように DashboardController と呼ばれます。

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import javax.inject.Inject;

@Named
@RequestScoped
public class DashboardController implements Serializable {

    @Inject
    private SessionManager sessionManager;
    ...
    public void loadUserInfo() {
        ...
        UserDto userDto = sessionManager.getLoginedUser();
    }
}

初めてページを開いたときに DashboardController を参照すると、うまく機能します。そして、私がウェブサイトを使い続ければ、それはまだ機能します. しかし、何分間もページをクリックせずに戻ってページを開くと、javassist$$getLoginedUser メソッド呼び出しの null ポインターが表示されます (デバッグを使用して監視すると、sessionManager は null ではありません)。セッションは引き続き有効です。面のコンテキストを使用して、セッション マップから直接値を取得できます。

SessionManager の何が問題になっていますか? ありがとう。

4

1 に答える 1

1

これは、ステートフル セッション Bean (EJB) がパッシベーションされ、セッションに再導入されないために発生します。セッション スコープ オブジェクトをセッション Bean にする必要があまりない場合は、SessionScoped マネージド Bean にします。

于 2013-08-27T22:38:21.513 に答える