A managed bean is sometimes null and sometimes not

I have a managed bean LoginBean:

@ManagedBean(name = "loginBean")
@SessionScoped
public class LoginBean implements Serializable {

    private String email, password;
    private BasicUser user;

    /** Creates a new instance of LoginBean */
    public LoginBean() {
    }

    public void setUser(BasicUser user) {
        this.user = user;
    }

    public BasicUser getUser() {
        return user;
    }

   ...
 }

And then a PhaseListener that receives loginBean sessions.

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;
            }
         }
      }
}

When I, after deploying to the admin console, click on the launch application, log in to my application via facebook, there are no problems with the code below. I can log out and log back in and still not a problem. If I then change my browser and try to log in via facebook, here I get a NullPointerException where I do

bean.setUser (facebookUser)

This also happens if I close the first browser, open again and try to log in via facebook. Why is this happening?

I am using Glassfish v3.

+3
2

bean null, , . . . JSF .

scope bean . API- Servlet - JSF. ExternalContext#getSessionMap() .

Map<String, Object> sessionMap = externalContext.getSessionMap();
LoginBean loginBean = (LoginBean) sessionMap.get("loginBean");
if (loginBean == null) {
    loginBean = new LoginBean();
    sessionMap.put("loginBean", loginBean);
}
// ...

, bean PhaseListener. PhaseListener, /. : .

+4

, bean , , PhaseListener . ?

: , true:

HttpSession session = (HttpSession) externalContext.getSession(true);

, , beans. Framework bean , , bean, .

+2

Source: https://habr.com/ru/post/1775837/


All Articles