Bonjour,

Je m'essaie au framework JSF, et pour comprendre le cycle de vie plus dans le détail, j'ai voulu implémenter mon propre PhaseListener pour analyser chaque étape, et pour comprendre dans quels cas (exactement) on "saute" certaines étapes du cycle de vie (on passe du restore view directement au render response).

Bref, j'ai donc créé ma classe monPhaseListener dans le package CycleDeVie de la manière suivante :
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
package CycleDeVie;
 
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
 
public class monPhaseListener implements PhaseListener {
 
    public PhaseId getPhaseId() {
        return PhaseId.ANY_PHASE;
    }
 
    public void beforePhase(PhaseEvent e) {
        System.out.println("Before "+e.getPhaseId());
    }
 
    public void afterPhase(PhaseEvent e) {
        System.out.println("After "+e.getPhaseId());
    }
}
Puis, j'ai ajouté les références à mon phaseListener dans le fichier faces-config.xml :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
<lifecycle>
        <phase-listener>CycleDeVie.monPhaseListener</phase-listener>
</lifecycle>
Et, pour être sûr que mon phaseListener soit bien reconnu par JSF, j'affiche tous les phases listeners du système (pour chercher le mien). J'ai donc ajouté cette méthode à un bean :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
PhaseListener[] listeners = ((LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY)).getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE).getPhaseListeners();
 
System.out.println("PhaseListeners : ");
for(PhaseListener listener: listeners) {
        System.out.println("\t"+ listener.getClass().getName());
}
Et là, surprise, je ne me retrouve non pas avec 2 phases listeners (celui du système et le mien), mais avec 3 phases listeners, dont deux fois le mien ! Voilà ce que me retourne cette méthode :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
PhaseListeners : 
        CycleDeVie.monPhaseListener
        CycleDeVie.monPhaseListener
        com.sun.rave.web.ui.appbase.faces.ViewHandlerImpl
Et, bien entendu, lorsque j'affiche quelque chose dans beforePhase de monPhaseListener, l'information est affichée deux fois pour chaque phase.

Là, je ne comprends plus trop... Pourquoi mon phaseListener personnalisé est pris en compte à double ?

Merci d'avance.