Tomcat 会话复制问题 - java.io.NotSerializableException: com.sun.fa



我在使用 DeltaManager 进行 tomcat 会话复制时遇到问题。在我用我的 SessionScoped bean (CDI( 找出所有问题(不可序列化的属性(后,现在我收到一个我无法修复的错误,因为我不知道问题出在哪里。这是底部的堆栈跟踪。

我已经浏览了我的代码并搜索可疑的HttpSession setAttribute调用或类似的东西,但一无所获。我使用 weld-servlet 2.4.5.Final 和 weld-api 2.4.Final。

我怎样才能找出真正的问题是什么?

`11-Sep-2019 11:15:43.331 SEVERE [http-nio-8081-exec-5] org.apache.catalina.ha.session.DeltaManager.requestCompleted Unable to serialize delta request for sessionid [8C493261547F84FCDF306258240EFC76]
java.io.NotSerializableException: com.sun.faces.cdi.SessionProducer$$Lambda$43/678571560
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at org.apache.catalina.ha.session.DeltaRequest$AttributeInfo.writeExternal(DeltaRequest.java:401)
at org.apache.catalina.ha.session.DeltaRequest.writeExternal(DeltaRequest.java:294)
at org.apache.catalina.ha.session.DeltaRequest.serialize(DeltaRequest.java:308)
at org.apache.catalina.ha.session.DeltaManager.serializeDeltaRequest(DeltaManager.java:594)
at org.apache.catalina.ha.session.DeltaManager.requestCompleted(DeltaManager.java:979)
at org.apache.catalina.ha.session.DeltaManager.requestCompleted(DeltaManager.java:946)
at org.apache.catalina.ha.tcp.ReplicationValve.send(ReplicationValve.java:523)
at org.apache.catalina.ha.tcp.ReplicationValve.sendMessage(ReplicationValve.java:511)
at org.apache.catalina.ha.tcp.ReplicationValve.sendSessionReplicationMessage(ReplicationValve.java:493)
at org.apache.catalina.ha.tcp.ReplicationValve.sendReplicationMessage(ReplicationValve.java:404)
at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:333)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)`

我已经想通了。我已经为"请求"创建了一个名为bean的替代bean,它是由CDI的SessionProducer class创建的。我的 bean 提供了我需要的方法及其请求范围而不是会话范围。我仍然不明白为什么由 jsf/cdi 框架创建的这种 bean 意味着会话范围。我认为当您使用 tomcat 并尝试序列化会话对象时,它总是会抛出错误。

最新更新