Grails会话范围服务抛出NotSerializable异常

时间:2016-07-08 07:30:13

标签: session grails serialization

我有一个实现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实现添加到写入会话的CrumbBreadCrumbType枚举(在控制器注释中使用)。

是否有人能够告诉我为什么会发生这种情况(我理解Serializable的概念)以及我如何解决它?

1 个答案:

答案 0 :(得分:0)

@HoàngLong的评论让我走上正轨。

当将Crumb对象(所有这些都被Serializable)写入会话时,我在BreadCrumbService中使用静态变量作为会话映射的键。

session[BreadCrumbService.NAMESPACE].crumb = new Crumb()

当我将此变量移动到Crumb对象时,问题已得到解决。

即使服务本身没有写入会话。在写入会话时仅仅引用服务中的变量需要服务,并且每个成员都是可序列化的。