La méthode @PostConstruct appelée deux fois pour la même requête
Je suis en utilisant JSF 2.0 avec GlassFish 3.0.
J'ai le texte suivant Managed Bean:
@ManagedBean
@RequestScoped
public class OverviewController{
private List<Event> eventList;
@PostConstruct
public void init(){
System.out.println("=> OverviewController - init() - enter");
System.out.println("=< OverviewController - init() - exit");
}
}
De la vue d'ensemble.xhtml fichier je vais appeler les différents attributs ou des méthodes à partir de mon OverviewController.
<ui:repeat var="event" value="#{overviewController.eventList}">
...
</ui:repeat>
Tout fonctionne bien mais le problème est que sur le Fichier de Log:
INFO: Enter : RESTORE_VIEW 1
INFO: Exit : RESTORE_VIEW 1
INFO: Enter : RENDER_RESPONSE 6
INFO: => OverviewController - init() - enter
INFO: => Overview Controller - updateSelectedTab() - enter
INFO: =< Overview Controller - updateSelectedTab() - exit
INFO: =< OverviewController - init() - exit
INFO: => OverviewController - init() - enter
INFO: => Overview Controller - updateSelectedTab() - enter
INFO: =< Overview Controller - updateSelectedTab() - exit
INFO: =< OverviewController - init() - exit
INFO: Exit : RENDER_RESPONSE 6
Comme vous pouvez le voir, La méthode init() est appelée deux fois dans la même demande pour aucune raison que ce soit. De ce que je sais, n'importe quelle méthode annotée avec PostConstruct est appelé une fois tous demande de. Suis-je tort?
EDIT:
Sans AJAX est utilisé sur la page.
J'ai vérifié le nombre de demandes avec firebug. Il y a des arbres requêtes effectuées:
- 1.Un pour le javax.des visages.ressources (GET)
- 2.Une pour le fichier css (GET)
- 3.Une pour la vue d'ensemble.xhtml (GET)
source d'informationauteur Ionut
Vous devez vous connecter pour publier un commentaire.
Qui peut se produire si vous disposez de plusieurs cadres de gestion de la même classe d'haricot. E. g. JSF et CDI, ou JSF et Printemps, ou en CDI et Printemps, etc. De façon optimale votre configuration et annotations sur le haricot.
Qui peut aussi se produire si vous utilisez CDI et sont à l'aide de plusieurs
@Named
annotations tout au long de la classe. Par exemple, un@Named
tout droit sur la classe de l'enregistrer comme un managed bean et une autre sur une@Produces
méthode de lecture. Vous devez vous demander si c'est vraiment nécessaire. Vous pourriez tout aussi bien utiliser#{bean.someObject}
au lieu de#{someObject}
.Qui peut également se produire si votre managed bean s'étend sur quelque classe abstraite qui, à son tour, également un
@PostConstruct
sur la méthode. Vous devez supprimer l'annotation. Alternativement, vous pouvez réaliser l'initialisation de la méthode abstraite et pas ont@PostConstruct
sur la mise en œuvre de haricot:Il est possible que les deux
init()
méthode et@PostConstruct
sont les méthodes de cuisson et à l'origine de ce comportement. Essayez de changer le nom de lainit()
méthode et/ou de la mettreprivate
. Je pense que cela peut être lié à vos problèmes:http://javahowto.blogspot.com/2011/07/servlet-init-method-vs-postconstruct.html
J'ai aussi trouvé un bon poste sur le débogage de JSF le cycle de vie ici:
Débogage de JSF le cycle de vie