Ich kann anscheinend keine Möglichkeit finden, zu erzwingen, dass eine anwendungsspezifische verwaltete Bean beim Starten der Webanwendung instanziiert/initialisiert wird. Es scheint so zu sein, dass anwendungsspezifische Beans beim ersten Zugriff auf die Bean instanziiert werden, nicht beim Start der Web-App. Bei meiner Web-App geschieht dies, wenn der erste Benutzer zum ersten Mal eine Seite in der Web-App öffnet.Wie erzwinge ich die Instanziierung eines Application-Scoped Bean beim Start der Anwendung?
Der Grund, warum ich dies vermeiden möchte, ist, dass während der Initialisierung meiner Application-Scoped Bean einige zeitaufwändige Datenbankoperationen stattfinden. Es muss eine Reihe von Daten aus dem persistenten Speicher abrufen und dann einige davon zwischenspeichern, die dem Benutzer häufig in Form von ListItem-Elementen usw. angezeigt werden. Ich möchte nicht, dass all dies geschieht, wenn der erste Benutzer eine Verbindung herstellt und somit verursachen eine lange Verzögerung.
Mein erster Gedanke war eine ServletContextListener contextInitialized() - Methode im alten Stil zu verwenden und von dort einen ELResolver zu verwenden, um manuell die Instanz meiner verwalteten Bean anzufordern (wodurch die Initialisierung erzwungen wird). Leider kann ich zu diesem Zeitpunkt keinen ELResolver verwenden, um die Initialisierung auszulösen, da der ELResolver einen FacesContext benötigt und der FacesContext nur während der Lebensdauer einer Anfrage existiert.
Kennt jemand eine alternative Möglichkeit, dies zu erreichen?
Ich verwende MyFaces 1.2 als JSF-Implementierung und kann derzeit nicht auf 2.x aktualisieren.
+1 für eine effektive Lösung. Eine kleine Frage: Ist es offiziell ok, dies gemäß der Spezifikation zu tun, oder hängt es von einigen JSF-Implementierungsdetails ab? Ich meine, eine JSF-Implementierung könnte entscheiden, ob eine Anwendungs-Bean in einer völlig nicht offensichtlichen Weise instanziiert wird und dann zum Beispiel die Bean neu erstellen würde. – ewernli
@BalusC Das war so einfach und es funktioniert. Ich hatte vermieden, die setAttribute() -Methode im ServletContext zu verwenden, weil ich dachte, dass es mit JSF interferieren würde, aber anscheinend nicht. PS: Liebe deine Seite bei blogspot.com - dein alter Artikel über die Verwendung von DataTables war hilfreich. –
@Jim: Gern geschehen. @ewernli: Die Spezifikation erlaubt dies nicht explizit, aber sie lässt das auch nicht explizit zu. Die Spezifikation beschreibt jedoch, dass eine verwaltete Bean erstellt werden muss, wenn sie nicht im Bereich vorhanden ist. – BalusC