j'ai un LoginBean de haricot géré:managed bean est parfois nul et parfois
@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;
}
...
}
Et puis un PhaseListener qui obtient le 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;
}
}
}
}
Quand je déploie après sur l'application de lancement de presse de la console d'administration, les journaux dans mon application via Facebook il n'y a pas de problème avec le code ci-dessous. Je peux me déconnecter et me reconnecter et toujours pas de problème. Si je change ensuite navigateur et tente de se connecter via facebook ici je reçois un NullPointerException où je
bean.setUser (facebookUser)
Cela se produit également si je ferme le premier navigateur, ouvre à nouveau et essaie de se connecter via facebook. Pourquoi cela arrive-t-il? J'utilise Glassfish v3.
L'indicateur booléen ne force pas la session en cours d'actualisation. Il indique simplement au servletcontainer d'en créer un nouveau s'il n'existe pas déjà. La cause est en effet due à l'accrochage sur une phase trop précoce (quand le haricot n'est pas encore créé) comme dans votre 1ère phrase. – BalusC
À droite, mais au cas où il n'y a pas de session active, il en créera une nouvelle. Dans ce cas, la session scoped bean ne sera pas disponible. Ou est-ce que je manque quelque chose ici? ;-) – tasel
Votre réponse implique qu'il est provoqué en définissant l'indicateur de création à true. C'est faux. – BalusC