Parece que no puedo encontrar una manera de forzar que un bean administrado con ámbito de aplicación se cree una instancia/inicialice cuando se inicia la aplicación web. Parece que los beans con ámbito de aplicación obtienen instantáneas perezosas la primera vez que se accede al bean, no cuando se inicia la aplicación web. Para mi aplicación web, esto sucede cuando el primer usuario abre una página en la aplicación web por primera vez.¿Cómo fuerzo a un bean con ámbito de aplicación para crear instancias al inicio de la aplicación?
La razón por la que deseo evitar esto es porque suceden varias operaciones de base de datos que consumen mucho tiempo durante la inicialización de mi bean con ámbito de aplicación. Tiene que recuperar un montón de datos del almacenamiento persistente y luego almacenar en caché algunos de los que se mostrarán con frecuencia al usuario en forma de elementos ListItem, etc. No quiero que todo eso suceda cuando el primer usuario se conecta y por lo tanto causa una larga demora
Mi primer pensamiento fue utilizar un método ServletContextListener contextInitialized() de estilo anterior y desde allí usar un ELResolver para solicitar manualmente la instancia de mi bean administrado (forzando así la inicialización). Lamentablemente, no puedo usar un ELResolver para activar la inicialización en esta etapa porque ELResolver necesita un FacesContext y el FacesContext solo existe durante la vigencia de una solicitud.
¿Alguien sabe de una manera alternativa de lograr esto?
Estoy utilizando MyFaces 1.2 como la implementación de JSF y no puedo actualizar a 2.x en este momento.
+1 para una solución efectiva. Una pequeña pregunta: ¿está oficialmente bien hacer eso según la especificación, o se basa en algunos detalles de implementación de JSF? Quiero decir, una implementación de JSF podría decidir realizar un seguimiento de si una instancia de la aplicación fue instanciada de una manera completamente no obvia y luego recrearía el bean, por ejemplo. – ewernli
@BalusC Eso fue muy simple y funciona. Había evitado utilizar el método setAttribute() en ServletContext porque pensé que interferiría con JSF, pero aparentemente no. PD: Me encanta tu página en blogspot.com: tu antiguo artículo sobre el uso de DataTables fue útil. –
@Jim: de nada. @ewernli: la especificación no permite explícitamente eso, pero tampoco explícitamente no permite eso. Sin embargo, la especificación describe que un bean administrado debe crearse cuando no está presente en el alcance. – BalusC