【问题标题】:Cannot resolve Struts2 NotSerializableException even after update to 2.3.12即使更新到 2.3.12 也无法解决 Struts2 NotSerializableException
【发布时间】:2013-03-12 05:41:45
【问题描述】:

我目前正在使用 struts2 进行工作,但突然出现此错误。我的对象的某些缓存不起作用。

我使用 JBoss 5 和 struts2 : struts2-core-2.3.4.1.jar xwork-core-2.3.4.1.jar

堆栈跟踪在这里:http://pastebin.com/QpPV01wX

这是一些sn-p:

java.io.NotSerializableException: com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
        at com.opensymphony.xwork2.inject.util.ReferenceMap.writeObject(ReferenceMap.java:595)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
        at java.util.HashMap.writeObject(HashMap.java:1001)
        at sun.reflect.GeneratedMethodAccessor413.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
        at java.util.HashMap.writeObject(HashMap.java:1001)
        at sun.reflect.GeneratedMethodAccessor413.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
        at org.jboss.ha.framework.server.SimpleCachableMarshalledValue.serialize(SimpleCachableMarshalledValue.java:271)
        at  

我会喜欢建议,否则我可能做错了什么。

非常感谢您,

** 已更新

我试图删除我在 struts.xml 中使用的令牌会话拦截器,问题就消失了。不过,如果我使用令牌,我不知道为什么会出错。至少在我的情况下,它是通过删除令牌会话拦截器来解决的。

我删除 struts.xml 上的以下行

<interceptor-ref name="tokenSession">
  <param name="excludeMethods">list</param>
  <param name="includeMethods">save,update</param>
</interceptor-ref>

【问题讨论】:

  • 您是否从某个旧版本迁移到 2.3.x?我已经看到了这个问题,但我无法确定来源:\ 如果您能描述您使用什么样的操作/结果(execAndWait),那就太好了,因为它看起来像一个 struts2 问题。
  • 可以,但不应该放在会话中。是您使用的某些操作或结果的副作用。换句话说:S2 本身不会将 Container 放入会话中。
  • 明确一点:这是 S2 中的一个错误,但我需要您的帮助来识别它。正如我所说,这一定是您的代码的副作用 - 您在与 S2 内部连接的 Session 中放置了一些东西,这些内部包含对 Container 的引用。
  • 好的,我已经更改了 ActionInvocation 在 HttpSession 中的存储方式,从 2.3.15 开始,一切都应该顺利进行 :-) issues.apache.org/jira/browse/WW-4028
  • 感谢@EricaKane,我们正在努力解决这个问题:)

标签: java serializable httpsession


【解决方案1】:

struts-2.3.32 也遇到了这个问题。 com.opensymphony.xwork2.DefaultActionInvocation 类具有对 Action 的引用。
如果您的操作扩展了com.opensymphony.xwork2.ActionSupport,那么它引用了com.opensymphony.xwork2.inject.Container
解决方法是删除对ActionSupport 的依赖。

【讨论】:

  • 您使用的是哪个版本的 S2?
【解决方案2】:

我通过切换到tokenInterceptor 代替tokenSessionInterceptor 解决了这个问题。 tokenInterceptor 在大多数情况下都可以。

【讨论】:

    【解决方案3】:

    我也遇到了同样的问题,但是我发现我的 struts2-spring-plugin-2.0.14.jar 与我的 struts2-core.2.2.3.jar 不匹配,所以我更换了 struts2-spring-plugin对应版本就可以了~ 祝你好运~希望这对其他人有帮助~​​

    【讨论】:

      【解决方案4】:

      似乎您已将未实现 java.io.Serializable 的对象放入缓存或会话中。

      【讨论】:

      • 谢谢@vhunsicker。我做了一些重新检查以确保我所有的会话对象都是可序列化的。你能提一下我可能遗漏的地方吗?
      • 确保您的会话对象没有不可序列化的字段,例如对容器的引用。
      • 是的,没错。 Serializables 应该只包含原始属性或自己实现 Serializable 的属性。对于某些属性不应该可序列化的情况,您可以将它们设为瞬态。
      • 您可以通过静态代码分析来检测此类问题。例如。在 PMD、findBugs 等的帮助下。
      • 据我所知,当类实现 Serializable 时,工具会指示哪些字段不可序列化。我猜你需要弄清楚哪些类应该实现 Serializable 。例如。您放入会话映射中的所有内容,Statefull SessionBeans, Entities, ..
      猜你喜欢
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 2021-08-30
      相关资源
      最近更新 更多