Tapestry SelectModelImpl Non Serializable阻止群集中的会话复制

Tapestry SelectModelImpl Non Serializable阻止群集中的会话复制,tapestry,Tapestry,我正在使用Tapestry 5.3.3对应用程序进行集群。集群是通过将HttpSession复制到集群中的所有节点来完成的。复制是通过序列化HttpSession进行的。当容器尝试序列化会话时,会引发NotSerializableException,因为org.apache.tapestry5.internal.SelectModelImpl不可序列化。Tapestry通过ClusteredSessionImpl类将该类添加到会话中。因此,Tapestry确实希望通过将相关信息保存到会话来实现集

我正在使用Tapestry 5.3.3对应用程序进行集群。集群是通过将HttpSession复制到集群中的所有节点来完成的。复制是通过序列化HttpSession进行的。当容器尝试序列化会话时,会引发NotSerializableException,因为org.apache.tapestry5.internal.SelectModelImpl不可序列化。Tapestry通过ClusteredSessionImpl类将该类添加到会话中。因此,Tapestry确实希望通过将相关信息保存到会话来实现集群友好。关于如何避开此异常,您有什么想法吗?

Tapestry用户邮件列表提供了一些很好的建议。显然,应该避免将SelectModel持久化到会话中。这里有几个回答-


是您的自定义代码在@persisteng SelectModel吗?如果是这样,您可以@persistent底层集合,并每次在UI中构建SelectModel。您应该记住,HTTPSession的使用应该保持在最低限度,特别是在集群环境中。HTTPSession的使用不能很好地扩展。 您真的需要在会话中保留列表吗?您是否可以在会话中存储一个用户id(或其他筛选器参数),并在每次需要服务时查找该列表?如果您后来发现查找成本很高,可以在服务级别上查看缓存

您应该阅读以下内容:


不要@Persist或@SessionState选择model。那是个坏主意。正如Lance所说,如果您确实需要以某种方式持久化它,那么持久化用于创建SelectModel的列表,而不是SelectModel本身