我有一个实现了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
,它使用服务将当前 Controller 和操作作为Crumb
对象写入 session 。我已经将Serializable
实现添加到了写入 session 的Crumb
和BreadCrumbType
Enum(在Controllers批注中使用)。有谁能向我指出为什么会发生这种情况(我理解Serializable的概念)以及如何解决它?
最佳答案
@HoàngLong的评论使我走了正确的路。
当将Crumb对象(所有这些对象都设置为可序列化)写入 session 时,我在BreadCrumbService中使用静态变量作为 session 映射的键。
session[BreadCrumbService.NAMESPACE].crumb = new Crumb()
当我将此变量移至Crumb对象时,此问题已解决。
即使服务本身尚未写入 session 。在编写 session 时仅引用Service内部的变量,就要求该服务和每个成员都是可序列化的。
关于session - Grails session 作用域服务抛出NotSerializable异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38261173/