【问题标题】:Grails session-scoped Service throwing NotSerializable ExceptionGrails 会话范围的服务抛出 NotSerializable 异常
【发布时间】:2016-07-08 07:30:12
【问题描述】:

我有一个实现 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 的概念)以及我该如何解决它?

【问题讨论】:

  • 您确定 BreadCrumbService 的所有成员都是瞬态的或可序列化的吗?

标签: session grails serialization


【解决方案1】:

@Hoàng Long 的评论让我走上了正轨。

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

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

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

即使服务本身没有被写入会话。在写入会话时仅引用服务内部的变量就要求服务和每个成员都是可序列化的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2013-09-28
    • 2012-09-20
    • 1970-01-01
    相关资源
    最近更新 更多