讨论:如何处理SessionScope和序列化自己的关系?

事情的起因是这样的:我想使用JSF2.0的ViewScope的MangedBean作为一个编辑界面的backing bean,但是发现它竟然要求这个bean必须要求支持序列化——因为ViewScope是通过把状态保存在ViewRoot上来实现的,这又依赖于StateManager,它在保存状态时需要序列化。本来让这个bean实现序列化接口就可以了,不过我这个bean可能还有一个属性是一个Spring的bean,难道我让这个Spring的bean也要支持序列化吗?

 

是的,问题的关键是序列化保存状态的问题引起的,其实SessionScope也会有这个问题——如果需要支持Session的复制的话。看来这不是JSF特有的问题,Spring中应该也有相似的问题,果不其然,我在Spring的论坛里找到了一个帖子:

 

http://forum.springsource.org/showthread.php?t=56569

 

写道
Hi,

we have a relatively large Spring-based web application. Our beans are generally of two types: application-wide services (stateless, usually singleton-scoped beans) and user-specific beans (typically stateful, session-scoped beans). Session-scoped beans are often injected with application beans and other session-scoped beans.

The problem we are facing now is that in this constellation, the HTTP session is not serializable since session beans reference application beans, which are not serializable. Another problem is that even if referenced bean is serializable, then after deserialization we'll get an multiple instances (unless we implement readResolve() and stuff).

So I'm really puzzled about how to make the HTTP session serializable in the case described above. My ideas are below:

1. Wrap all of the beans in a serializable scoped proxies. If target object is not serializable, scoped proxy will just serialize null and retrieve a new instance when called after deserialization.

This may work. However, it seems to be an overkill for me since it seems as ALL of the beans must be proxied. Means every method call will go through a proxy which I don't like much.

2. Invent some kind of a mechanism which would reinject transient properties. That is, serializable beans which reference non-serializable beans mark corresponding fields as transient. These values are not serialized. Then, when session is deserialized and the application accesses a deserialized session bean, transient properties (present in the bean definition in Spring) are re-injected by the bean factory.

From the Spring user perspective this would be the most convenient thing: just mark field as transient and Spring ("extended" session scope or whatever) will reinject the transient properties into the deserialized instance. However, I'm not sure if this is a correct approach. I also don't know what to do with bean initialization (like InitializingBean and so on). I'm also not sure if this is valid at all and if it is technically possible.

So I'd be very grateful if you guys comment on my problem/ideas.
 

如果你在Spring的SessionScope的bean中引用SingletonScoped的bean的话也会存在同样的问题。上面的帖子给出两种可能的解决方案,不过并不完美。或许本不该这么用?避免这么使用吗?

 

回到JSF,有时候这么用有很方便,我想出两种解决方案:

 

  • 在JSF的SessionScope和ViewScope的managed bean中不注入Spring的bean,这两种Scope的managed bean只保存一般的属性和领域对象。处理界面的操作的部分放入另一个RequestScope的managed bean中,并在这个RequestScope的managedbean中引用SessionScope或ViewScope的managed bean。缺点就是无端多出几个manged bean来。
  • 不使用IoC的方式注入Spring的bean到managed bean中,而是每次通过Spring的Application Context去getBean,这样manged bean中不存在对Spring bean的引用,序列化就不成问题了。缺点就是可能牺牲一些代码的优雅性,Mock测试mangaged bean的时候也不太方便。不过一般很少mock测试manged bean。

还有更好的解决方案吗?

 

最近开到Gavin King发表的一个评论上说使用JSF2.0,EJB和CDI的时候不需要考虑这个序列化的问题,也许JSF和EJB,CDI结合的更完美些,毕竟都是JEE的标准。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值