No estoy seguro de si lo que estoy haciendo es incorrecto, o si me perdí una anotación o elemento de configuración en alguna parte. Aquí está la situación:JSF: el bean administrado con el alcance de la sesión no tiene reinyecciones de dependencias en la deserialización de la sesión
Tengo una aplicación JSF con un bean con ámbito de sesión llamado SessionData
. Este bean tiene una referencia de bean con ámbito de aplicación (del tipo ApplicationData
) inyectado en el momento de la creación. Esto funciona bien cuando la sesión se crea por primera vez. La inyección de dependencias se realiza con <managed-bean>
elementos en el archivo faces-config.xml
como se muestra aquí:
<managed-bean>
<managed-bean-name>sessionData</managed-bean-name>
<managed-bean-class>my.package.SessionData</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>applicationData</property-name>
<property-class>my.package.ApplicationData</property-class>
<value>#{applicationData}</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>applicationData</managed-bean-name>
<managed-bean-class>my.package.ApplicationData</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
Debido a que no tiene sentido tener mi objetivo SessionData
incluyen el objeto ApplicationData
cuando es serializado, He marcado la referencia ApplicationData
como transitorio en mi objeto SessionData
:
transient private ApplicationData applicationData;
Todo es bueno hasta que se detuvo la aplicación web (en mi contenedor Tomcat 6.x) y las sesiones se efectúan en serie. Cuando reinicio la aplicación y las sesiones se deserializan, mi referencia a ApplicationData
no es reinyectada por JSF. Sé que se supone que la deserialización deja campos transitorios sin valor. ¿Hay alguna manera de indicarle a JSF que este objeto con ámbito de sesión requiere que sus dependencias se vuelvan a establecer después de la deserialización?
Estoy usando MyFaces JSF 1.2 y Tomcat 6.0.26 como mi contenedor de aplicaciones web.
Se sugirió que suministre un método readObject() y configure manualmente el objeto ApplicationData durante la deserialización utilizando FacesContext. No creo que eso funcione, ya que FacesContext solo está disponible durante la vigencia de una solicitud. La deserialización ocurre al inicio de la aplicación. –
correcto, es por eso que eliminé mi respuesta. Parece más complicado (de ahí que +1 para la pregunta) – Bozho