Bonjour,

voila, je suis en peu perplexe, je me pose des questions sur comment gérer proprement un état dans JSF2.
En gros je cherche à gérer une sorte de session, je sais qu'il existe l'objet HTTPSession mais on peut aussi travailler avec les managedBean
et l'injection d'un ManagedBean dans un autre en déclarant SessionScope dans le premier. Je ne vois pas bien la différence ?
Comment faites vous ?

Par ailleurs, j'ai un problème quand je passe d'un page à l'autre.
J'ai un Bean, qui doit gérer ma session

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
@ManagedBean(name="ConfigurationSession")
@SessionScoped
public class ConfigurationSession {
 
    private String degre;
 
 
    /**
     * Creates a new instance of ConfigurationSession
     */
    public ConfigurationSession() {
    }
     public String getDegre() {
        return degre;
    }
 
    public void setDegre(String degre) {
        this.degre = degre;
    }
}
je vais de la page choix.xhtml à la page question.xhtml
la première injecte ce bean session avec

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
public class ChoiceManagedBean implements Serializable{
 
    String degreitems;
 
    @ManagedProperty(value = "#{configurationSession}")
    ConfigurationSession configsession;
 
 
 
    @EJB
    ConfigurationSessionBeanLocal config;
 
    /**
     * Creates a new instance of ChoiceManagedBean
     */
    public ChoiceManagedBean() {
 
    }
    @PostConstruct
    public void init(){
        configsession = new ConfigurationSession();
    }
    public ConfigurationSession getConfigsession() {
        return configsession;
    }
 
    public void setConfigsession(ConfigurationSession configsession) {
        this.configsession = configsession;
    }
...
 public void changedegre() {
        System.out.println("la question " + this.degreitems);
        String outcome = null;
 
        if("degre1".equals(this.degreitems)){
            outcome = "coreTemplateClient";
            configsession.setDegre("deg1");
        }
        if("degre2".equals(this.degreitems)){
            outcome = "coreTemplateClient";
            configsession.setDegre("deg2");
        }
        if(outcome!=null){
            System.out.println("Redirection");
            FacesContext context = FacesContext.getCurrentInstance();
            NavigationHandler navigationHandler = context.getApplication()
                    .getNavigationHandler();
            navigationHandler.handleNavigation(context, null, outcome
                    + "?faces-redirect=true");
        }else{
            String message = "Vous devez choisir un degré !!";
            System.out.println("message erreur");
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(message));
        }
    }
apparemment cela fonctionne mais quand je passe de la page choix à question entre deux j'ai la méthode
changedegre, qui fonctionne et qui redirige vers la page question, le pb arrive quand dans la page question
je veux récupérer mon bean session ....


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
public class QuestionnaireControler {
 
    private String theme;
    public String question;
 
 
    private Map<String,String> questions;
    private List<SelectItem> questionsitems;
    private List<EticQuestions> listeQuestionsLocal;
    private EticQuestions questionLocal;
    private boolean themeactif=true;
 
 
    ConfigurationSession configsession;
 
 
    private String intitule ="Ajouter un thème";
    /**
     * Creates a new instance of QuestionnaireControler
     */
    public QuestionnaireControler() {
       questionLocal =  new EticQuestions();
       questionLocal.setLibelleQuestion("Saisir votre intitulé");
    }
    @PostConstruct
    public void init(){
        configsession = new ConfigurationSession();
        configsession = findBean("configurationSession");
        System.out.println(" config "+ configsession.getDegre());
    }
    @SuppressWarnings("unchecked")
        public static <T> T findBean(String beanName) { /** Récupéré de Balusc C*/
        FacesContext context = FacesContext.getCurrentInstance();
        return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
    }
    /**
     * Inject ManagedBean dans la session
     * @return 
     */
    public ConfigurationSession getConfigsession() {
        return configsession;
    }
 
    public void setConfigsession(ConfigurationSession configsession) {
        this.configsession = configsession;
    }
J'ai le code d'erreur

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.glassfish.faces.integration.GlassFishInjectionProvider$2.run(GlassFishInjectionProvider.java:382)
    ... 81 more
Caused by: java.lang.NullPointerException
    at open.ged.jsf.QuestionnaireControler.init(QuestionnaireControler.java:58)
    ... 86 more
Voili voilou

Olivier