時々nullで、時にはません。マネージドBeanは、私が管理Bean LoginBeanを持って
public class FacebookSignInListener implements PhaseListener, UserService {
private LoginBean bean;
....
@Override
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
@Override
public void afterPhase(PhaseEvent event) {
HttpSession session = (HttpSession) event.getFacesContext().getExternalContext().getSession(true);
bean = (LoginBean) session.getAttribute("loginBean");
bean.setUser(facebookUser);
}
@Override
public void beforePhase(PhaseEvent event) {
FacesContext fc = FacesContext.getCurrentInstance();
request = (HttpServletRequest) fc.getExternalContext().getRequest();
boolean isLoginPage =
(fc.getViewRoot().getViewId().indexOf("welcome") > -1);
if (isLoginPage) {
try {
FBOauth fbo = new FBOauth(this);
fbo.doLogin(request);
} catch (IOException ex) {
Logger.getLogger(FacebookSignInListener.class.getName()).log(Level.SEVERE, "Could not exchange code for access_token. Page where not found.", ex);
}
}
}
@Override
public boolean authFacebookLogin(String accessToken, FacesContext fc) throws FacebookException {
if (accessToken != null) {
FacebookClient facebookClient = new DefaultFacebookClient(accessToken);
User fbUser = facebookClient.fetchObject("me", User.class);
UserHelper uh = new UserHelper();
FacebookUser facebookUser = (FacebookUser) uh.getByFacebookId(fbUser.getId());
// Does the user already exist and is he already connected with facebook.
if (facebookUser != null) {
return true;
}
}
}
}
管理コンソールでアプリケーションを起動した後、アプリケーションにログインするときに、以下のコードに問題はありません。私はもう一度ログアウトしてログインすることができますが、問題はありません。私は、ブラウザを変更して、Facebook経由のログインしようとすると、ここで私は私が
を行うNullPointerExceptionがbean.setUser(facebookUser)
を得るこれは私が最初にブラウザを閉じた場合にも、起こり再び開き、 Facebook経由でログインしようとします。なぜこうなった?
私はGlassfish v3を使用しています。
ブール値フラグはセッションを強制的にリフレッシュしません。サーブレット・コンテナがまだ存在していない場合は、新しいサーブレット・コンテナを作成するよう指示します。この原因は、実際には、最初の文のように(まだBeanが作成されていない)あまりにも早い段階でフックすることによるものです。 – BalusC
そうですが、アクティブなセッションがない場合、新しいセッションが作成されます。その場合、セッションスコープBeanは使用できません。または私はここに何かを逃していますか? ;-) – tasel
あなたの答えは、それがtrueにcreateフラグを設定することによって引き起こされることを意味しています。これは間違っています。 – BalusC