【发布时间】:2011-04-16 06:06:48
【问题描述】:
我不确定我在做什么是错的,或者我只是在某处遗漏了注释或配置项。情况如下:
我有一个 JSF 应用程序,其中包含一个名为 SessionData 的会话范围 bean。此 bean 在创建时注入了一个应用程序范围的 bean 引用(类型为ApplicationData)。首次创建会话时,这可以正常工作。依赖注入是使用faces-config.xml 文件中的<managed-bean> 元素完成的,如下所示:
<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>
因为我的SessionData 对象在序列化时包含ApplicationData 对象是没有意义的,所以我在SessionData 对象中将ApplicationData 引用标记为瞬态:
transient private ApplicationData applicationData;
在 Web 应用程序停止(在我的 Tomcat 6.x 容器中)并且会话被序列化之前,一切都很好。当我重新启动应用程序并且会话被反序列化时,我对 ApplicationData 的引用不会被 JSF 重新注入。我知道反序列化应该使瞬态字段没有值。 有没有办法向 JSF 发出信号,表明此会话范围的对象需要在反序列化后再次设置其依赖项?
我使用 MyFaces JSF 1.2 和 Tomcat 6.0.26 作为我的 Web 应用程序容器。
【问题讨论】:
-
建议我提供一个 readObject() 方法,并在反序列化期间使用 FacesContext 在其中手动设置 ApplicationData 对象。我认为这不会起作用,因为 FacesContext 仅在请求的生命周期内可用。反序列化发生在应用程序启动时。
-
正确,这就是我删除答案的原因。它看起来更复杂(因此问题+1)
标签: java jsf serialization dependency-injection httpsession