【问题标题】:Spring services should be serializableSpring服务应该是可序列化的
【发布时间】:2015-01-06 07:39:10
【问题描述】:

我正在开发 Spring-mvc 应用程序。

我收到NotSerializableException

服务器重启时出现异常。我搜索了解决方案并知道会话范围的 bean 应该被序列化。

我的会话范围 bean 实现了可序列化,但它为注入的 bean 和服务提供了异常。

它要求我序列化所有注入的 bean 和服务。

我已经序列化了我的 bean,但也需要序列化服务。

序列化服务也是可接受的行为吗? 如果是,那么我是否必须序列化我的应用程序中的所有服务?

谢谢。

【问题讨论】:

  • 你不能让注入的服务瞬态吗?
  • 重启时会导致NPE,如有错误请指正。参考stackoverflow.com/questions/7502891/…
  • 你的意思是'应该Serializable'吗?
  • 是的,我已经更新了我的问题标题。

标签: java spring spring-mvc serialization


【解决方案1】:

当您重新启动或关闭 Tomcat 并在启动时恢复会话时,Tomcat 会序列化会话范围 bean。您可以为要恢复的 bean 实现 serializable。否则跳过此错误。

编辑:创建一个类serializable 意味着该类不能包含不可序列化的引用,或者这些引用必须声明为transient

在反序列化对象时,transient 字段将重置为默认值,因此您可能需要使用 if( transientField == null) { .. } 重新初始化它

【讨论】:

  • 如 cmets 中所述,在 NPE 中将引用作为瞬态结果。我只是在检查我是否可以解决这个问题。我最后的选择是避免它。
  • @Mathendra 可能会很好地扩展答案,说明需要在会话加载时重新设置瞬态变量。 (通常: if (... == null) { ... } 。虽然我个人认为任何会话状态 bean 都不应该包含对外部服务的引用,但看起来提问的人有这个。
  • @Joeblade,你的观点回答了我的问题。我将删除对外部服务的引用,这在我的情况下是可能的。但是,如果使用对外部服务的引用,我将不得不在我使用外部服务的会话 bean 的每个方法中使用 if (... == null) { ... }。您能否将其添加到答案中,以便我接受。谢谢。
  • @Joeblade 这是隐含的,但无论如何感谢您指出它会导致解决。 :)
  • @NamanGala 抱歉,我不是故意要窃取您的答案,我确实是想让您扩展答案。如果你不想写,我会添加第二个答案
【解决方案2】:

正如马亨德拉已经指出的那样:

在反序列化对象时,瞬态字段将重置为默认值,因此您可能需要使用 if(transientField == null) { .. }

重新初始化它

当您制作可序列化的 bean 时,请确保您不想存储到磁盘的任何引用都被标记为瞬态。这意味着在加载 bean 之后,您重新设置了设置为 null 的 bean 成员。

例如:

private transient SomeService localServiceRef;
SomeService getSomeService() {
    if (localServiceRef == null) {
        localServiceRef = SomeService.getInstance();
    }
    return localServiceRef;
}

或者您可以将 id 存储在本地,并拥有一个瞬态解析的对象

private String objectId;
private transient SomeObject localObject;
SomeObject getLocalObject() {
    if (localObject == null) {
        localObject = SomeObjectFactory.getById(objectId);
    }
    return localObject;
}

虽然这当然取决于你的实际代码。

我个人不喜欢使用实际包含服务等的 bean。我更喜欢将 bean 作为值对象和服务,以便通过其他方式找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-11
    • 2018-09-12
    • 2016-12-12
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    相关资源
    最近更新 更多