[JAVA] java.io.NotSerializableException: org.apache.catalina.session.StandardSessionFacade
여러 대의 WAS 간 세션 클러스터링을 적용한 경우, 세션(session)의 어트리뷰트에 담는 Object가 직렬화를 구현(implements Serializable)하지 않은 경우 java.io.NotSerializableException 오류가 발생한다.
|
2021. 1. 21 오후 10:12:10 org.apache.catalina.ha.session.DeltaManager requestCompleted 심각: Unable to serialize delta request for sessionid [A5A5A91419C7543592867E3FBAFE85FA] java.io.NotSerializableException: org.apache.catalina.session.StandardSessionFacade at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164) 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 org.apache.catalina.ha.session.DeltaRequest$AttributeInfo.writeExternal(DeltaRequest.java:407) at org.apache.catalina.ha.session.DeltaRequest.writeExternal(DeltaRequest.java:300) at org.apache.catalina.ha.session.DeltaRequest.serialize(DeltaRequest.java:314) at org.apache.catalina.ha.session.DeltaManager.serializeDeltaRequest(DeltaManager.java:584) at org.apache.catalina.ha.session.DeltaManager.requestCompleted(DeltaManager.java:967) at org.apache.catalina.ha.session.DeltaManager.requestCompleted(DeltaManager.java:935) at org.apache.catalina.ha.tcp.ReplicationValve.send(ReplicationValve.java:537) at org.apache.catalina.ha.tcp.ReplicationValve.sendMessage(ReplicationValve.java:524) at org.apache.catalina.ha.tcp.ReplicationValve.sendSessionReplicationMessage(ReplicationValve.java:506) at org.apache.catalina.ha.tcp.ReplicationValve.sendReplicationMessage(ReplicationValve.java:419) at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:343) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1137) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:662)
|
대표적으로 String 은 implements Serializable 되어있기 때문에 아래와 같이 써도 문제없다(위 오류와 관계없다).
|
String str = “value”;
session.setAttribute(“key”, str);
|
cf) String.class
|
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
(중략)
}
|
물론 WAS에 세션 클러스터링을 적용하지 않는 경우에는 세션에 어떤 Object를 담아도 위 오류가 발생하지 않는다.
그래도 이러한 상황을 고려해서 기본적으로 세션 어트리뷰트에 세팅하는 Object들은 implements Serializable 로 직렬화 처리를 해주는 것을 권장한다.
참고사이트 : https://okky.kr/article/575327