Search code examples
jsfmanaged-beansession-scope

Why cant I get the value of a SessionScoped bean in the constructor of another bean?


I have this SessionScoped bean:

@ManagedBean
@SessionScoped
public class LoginBean implements Serializable {

/**
 * Creates a new instance of LoginBean
 */
public LoginBean() {
    this.usuario = new Usuario();
}

private Usuario usuario;
//getter & setter

}

The Usuario class:

public class Usuario {

public Usuario() {
}

private String password;
private String nombre;
private int idPlanta;
private int nivel;
private String idUsuario;
//getters & setters
}

And I want to get the value of the property idPlanta from the SessionScoped bean (LoginBean) here (in the constructor) see the comments:

@ManagedBean
@ViewScoped
public class PrincipalBean implements Serializable {

public PrincipalBean() {
    System.out.println(this.login.getUsuario().getIdPlanta());
    //AT THIS POINT THE VALUE OF idPlanta IS 0 but in the session I have 1...
    //Method that uses the idPlanta value as a parameter
}

@ManagedProperty(value = "#{loginBean}")
private LoginBean login;

public LoginBean getLogin() {
    return login;
}

public void setLogin(LoginBean login) {
    this.login = login;
}

}

But when I show the value in the view it shows the value that really is in the Session idPlanta = 1. I dont understand why I cant get the value of that property in the constructor of that ViewScoped bean (PrincipalBean). I show the value in the view here(I know I can get it directly fron the LoginBean but this is just to show that the property login in PrincipalBean has the Session value):

<h:outputText class="titulo" value="Bienvenido(a) #{principalBean.login.usuario.nombre} Planta #{principalBean.login.usuario.idPlanta}" />

The value of idPlanta in PrincipalBean is very important because I use it as a method parameter to show more info when the view is showed.

Please help me. I still learning JSF.


Solution

  • You need to be using these values after the bean has been constructed. When your constructor is called, your bean has net yet been initialzed - therefore the injections have not yet happend. Using the @PostConstruct method you will be able to access the desired values from the injected objects.

    For example :

    @ManagedBean
    @ViewScoped
    public class PrincipalBean implements Serializable {
    
        public PrincipalBean() {
    
        }
    
        @PostConstruct
        public init() {
            System.out.println(this.login.getUsuario().getIdPlanta());
            //AT THIS POINT THE VALUE OF idPlanta IS 0 but in the session I have 1...
            //Method that uses the idPlanta value as a parameter
        }
    
        @ManagedProperty(value = "#{loginBean}")
        private LoginBean login;
    
        public LoginBean getLogin() {
            return login;
        }
    
        public void setLogin(LoginBean login) {
            this.login = login;
        }
    }
    

    See Also