sessionに登録するのはSerializableしたオブジェクト!
実装が終わった~ということで、SonarLintで解析をしたらコードのミスを指摘されました
HogeData data = new HogeData();
//略(dataに値をつめる)
session.setAttribute("KEY", data);
の setAttribute の data 部分に波線が...。
指摘内容は以下の通りです。
Make “HogeData” serializable or don’t store it in the session.
アプリは問題なく動いているので気づかなかったのですが、バグなので取り除きます!
#原因
「セッションに登録するObjectはSerializableでなければならない」より引用↓
セッションは画面遷移をまたいでオブジェクトを保存できる便利な「入れ物」ですが、基本的にメモリ領域の一部を割り当てて使っているため、 (1)割り当て領域が満杯になってしまったときや、(2)サーブレットコンテナを停止するときに、セッション上の保存オブジェクトをいったんDiskに書き出して退避させます。
このようなオブジェクトのDisk書き出し処理をシリアライズといいます。 Javaではどんなオブジェクトもシリアライズできるわけではなくて、 java.io.Serializable を実装(implements)したクラスだけが対象となります。
Serializableを実装していないオブジェクトをセッションに保存した場合、最初のうちは問題ないかと思いますが、シリアライズが必要な局面でトラブルを起こします。
(通常は NotSerializableException という例外を発生します。)
この問題は開発環境での一過性のテストでは発見しにくく、本番環境で連続稼動しているうちにトラブルの形で初めて発覚することが多いため、十分な注意が必要です。
HttpSessionにObjectを格納する際にはシリアライズ可能であることが必須なようです。
TestDataはSerializableを実装していなかったので指摘されてしまいました。
#解決方法
SonarLintの指摘通り、TestDataクラスにSerializableをimplementsしました。
import java.io.Serializable;
public class HogeData implements Serializable {
private String AAA;
private String BBB;
//略
}
#参考ページ
・セッションに登録するObjectはSerializableでなければならない
・Tomcat のセッション永続化について