Wicket 在会话级别管理不可序列化对象

Wicket 在会话级别管理不可序列化对象,wicket,Wicket,我的Wicket应用程序集成了两个第三方服务。当用户对应用程序进行身份验证时,其中一个服务将实例化与该特定用户绑定的客户端对象 实例化客户机非常昂贵,因此在每个请求中重新实例化它不是一个很好的选择。如果客户端是可序列化的,我会在会话中保留一个引用,但因为它不是,所以我在应用程序级别维护一个客户端映射,由会话设置密钥。它可以工作,但有点麻烦,特别是当会话过期或其他行为不正常且映射不同步时 我想知道是否还有其他办法解决这个问题。我一直在考虑拦截会话的序列化,并在内存中维护客户端实例 有什么建议吗?不

我的Wicket应用程序集成了两个第三方服务。当用户对应用程序进行身份验证时,其中一个服务将实例化与该特定用户绑定的客户端对象

实例化客户机非常昂贵,因此在每个请求中重新实例化它不是一个很好的选择。如果客户端是可序列化的,我会在会话中保留一个引用,但因为它不是,所以我在应用程序级别维护一个客户端映射,由会话设置密钥。它可以工作,但有点麻烦,特别是当会话过期或其他行为不正常且映射不同步时

我想知道是否还有其他办法解决这个问题。我一直在考虑拦截会话的序列化,并在内存中维护客户端实例

有什么建议吗?

不要这样做! 根据tetsuo的评论,这种方法行不通

原始的、不起作用的提议 除了
HttpSessionListener
,您还可以在应用程序中使用
WeakHashMap
。然后,您可以在Wicket
会话中保留客户端对象的密钥。当会话被销毁时,映射中相应的键值条目将被自动垃圾收集


在Java中可以看到这一点。

您是否使用了确保关闭已破坏会话的客户端?这实际上不是一个坏主意!我正在寻找一个更“内置”的Wicket解决方案,但这实际上可能会很好地解决问题。
WeakHashMap
可能会失败(或者非常脆弱)。由于Wicket会在每次请求时对会话进行序列化和反序列化,因此内存中的会话对象将被GC化并重新创建。因此,映射键将被释放,弱引用值将符合收集条件。