我有一个实现Breadcrumb系统的Grails 3应用程序(3.1.1)。我基于this plugin将其基于早期版本的Grails。
它在本地运行正常(使用Grails命令行命令run-app
),但是,当我在Tomcat 7上构建并运行时,我得到以下异常:
Jul 08, 2016 5:10:34 PM org.apache.catalina.ha.session.DeltaManager requestCompleted
SEVERE: Unable to serialize delta request for sessionid [6605EAC9C04DF7E2512493CABDFB1AD2]
java.io.NotSerializableException: au.packagename.BreadCrumbService
上述命名服务的范围设置为session
,并指定为代理。我甚至添加了Serializable
实现,但这似乎没有帮助。
class BreadCrumbService implements Serializable {
static transactional = false
static scope = 'session'
static proxy = true
}
我有Interceptor
使用服务将当前控制器和操作作为Crumb
对象写入会话。我已将Serializable
实现添加到写入会话的Crumb
和BreadCrumbType
枚举(在控制器注释中使用)。
是否有人能够告诉我为什么会发生这种情况(我理解Serializable的概念)以及我如何解决它?
答案 0 :(得分:0)
@HoàngLong的评论让我走上正轨。
当将Crumb对象(所有这些都被Serializable)写入会话时,我在BreadCrumbService中使用静态变量作为会话映射的键。
session[BreadCrumbService.NAMESPACE].crumb = new Crumb()
当我将此变量移动到Crumb对象时,问题已得到解决。
即使服务本身没有写入会话。在写入会话时仅仅引用服务中的变量需要服务,并且每个成员都是可序列化的。