JSF initialise le bean application-portée lorsque le contexte est initialisé
Je suis en train de construire un JSF+Facelets web app, un morceau de ce qui est une méthode d'analyse d'un répertoire de chaque si souvent et indexe tous les changements. Cette méthode fait partie d'un haricot qui est à la portée de l'application. J'ai construit une sous-classe de TimerTask pour appeler la méthode, toutes les X millisecondes. Mon problème est d'obtenir le haricot initialisé. Je peut faire référence à la fève sur une page, et quand je vais sur la page, le haricot est initialisé, et travaille selon les instructions; ce que je voudrais, au contraire, est pour le haricot être initialisé lorsque le contexte web est initialisé, de sorte qu'il ne nécessite pas une visite pour commencer l'indexation de la méthode. Google a montré quelques personnes qui veulent cette fonctionnalité, mais pas vraiment de solutions à l'extérieur de l'intégration avec le Printemps, je ne veux vraiment pas le faire juste pour obtenir cette fonctionnalité.
J'ai essayé de jouer à la fois avec les servlets qui ont "load-on-startup" et d'un ServletContextListener pour faire avancer les choses, et n'ont pas été en mesure d'obtenir le bien mis en place, soit parce qu'il n'y a pas un FacesContext disponibles, soit parce que je ne peut pas référence à la fève de la JSF environnement.
Est-il possible d'obtenir un bean JSF initialisé sur la web app de démarrage?
source d'informationauteur Matt McMinn | 2008-11-24
Vous devez vous connecter pour publier un commentaire.
Si votre code appelle FacesContextil ne fonctionnera pas à l'extérieur d'un thread associé à un JSF demande de cycle de vie. Un FacesContext objet est créé pour chaque demande et éliminés à la fin de la requête. La raison, vous pouvez le récupérer via un appel statique est parce qu'elle est définie à un ThreadLocal au début de la demande. Le cycle de vie d'un FacesContext n'a aucun rapport avec celle d'un ServletContext.
Peut-être que ce n'est pas suffisant (il semble que vous avez déjà été en bas de cette route), mais vous devriez être capable d'utiliser un ServletContextListener à faire ce que vous voulez. Assurez-vous que tous les appels à la FacesContext sont conservés dans la JSP demande du thread.
web.xml:
Mise en œuvre:
Vous pouvez prendre cet objet via le JSF la portée de l'application (ou tout simplement directement si aucune autre variable n'existe avec le même nom):
Si vous souhaitez récupérer l'objet dans un managed bean JSF, vous pouvez obtenir à partir de la ExternalContext:
À l'aide d'écouteurs ou de la charge-sur-démarrage, essayez ceci: http://www.thoughtsabout.net/blog/archives/000033.html
Dans JSF 2+, vous pouvez utiliser un
SystemEventListener
de le gérer. Vous définissez à passer à l'action sur lePostConstructApplicationEvent
pour l'initialiser.La mise en œuvre devrait ressembler à quelque chose comme :
Cela vous permettra de faire beaucoup plus que de simplement le passage d'une valeur.