https://bz.apache.org/bugzilla/show_bug.cgi?id=64023
Bug ID: 64023 Summary: Session serialization does not support values that (de)serialize to null Product: Tomcat 9 Version: unspecified Hardware: PC OS: Linux Status: NEW Severity: normal Priority: P2 Component: Cluster Assignee: dev@tomcat.apache.org Reporter: apa...@nospam.obeliks.de Target Milestone: ----- For caching purposes, we put some attributes in the session that are not supposed to be distributed to backup nodes. We wanted to keep the webapp distributable, and exclude these values explicitly from serialization, by wrapping them in a serialization proxy that serializes to null (using writeReplace). While null values in the session are excluded from serialization in the first place, null values returned from deserialization cause a NullPointerException when the object is put into the ConcurrentHashMap: > java.lang.NullPointerException > at > java.base/java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1011) > at > java.base/java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1006) > at > org.apache.catalina.ha.session.DeltaSession.doReadObject(DeltaSession.java:849) > at > org.apache.catalina.ha.session.DeltaSession.readObjectData(DeltaSession.java:618) > at > org.apache.catalina.ha.session.DeltaSession.readExternal(DeltaSession.java:593) > at > java.base/java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:2136) > at > java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2085) > at > java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594) > at > java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430) > at > org.apache.catalina.tribes.io.XByteBuffer.deserialize(XByteBuffer.java:560) > at > org.apache.catalina.tribes.tipis.AbstractReplicatedMap$MapMessage.value(AbstractReplicatedMap.java:1507) > at > org.apache.catalina.tribes.tipis.AbstractReplicatedMap$MapMessage.deserialize(AbstractReplicatedMap.java:1465) > at > org.apache.catalina.tribes.tipis.AbstractReplicatedMap.messageReceived(AbstractReplicatedMap.java:663) > at > org.apache.catalina.tribes.group.GroupChannel.messageReceived(GroupChannel.java:336) > at > org.apache.catalina.tribes.group.ChannelInterceptorBase.messageReceived(ChannelInterceptorBase.java:91) > at > org.apache.catalina.tribes.group.interceptors.TcpFailureDetector.messageReceived(TcpFailureDetector.java:117) > at > org.apache.catalina.tribes.group.ChannelInterceptorBase.messageReceived(ChannelInterceptorBase.java:91) > at > org.apache.catalina.tribes.group.ChannelInterceptorBase.messageReceived(ChannelInterceptorBase.java:91) > at > org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor.messageReceived(ThroughputInterceptor.java:86) > at > org.apache.catalina.tribes.group.ChannelInterceptorBase.messageReceived(ChannelInterceptorBase.java:91) > at > org.apache.catalina.tribes.group.ChannelCoordinator.messageReceived(ChannelCoordinator.java:274) > at > org.apache.catalina.tribes.transport.ReceiverBase.messageDataReceived(ReceiverBase.java:261) > at > org.apache.catalina.tribes.transport.nio.NioReplicationTask.drainChannel(NioReplicationTask.java:213) > at > org.apache.catalina.tribes.transport.nio.NioReplicationTask.run(NioReplicationTask.java:101) > at > java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) > at > java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) > at java.base/java.lang.Thread.run(Thread.java:834) While this might be an unconventional solution, it should be possible to have null values in the object stream. A simple null-check after deserialization (in both DeltaSession and StandardSession) looks sufficient. -- You are receiving this mail because: You are the assignee for the bug. --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org