Spring SessionでClassNotFoundException
2017年06月26日 22時37分21秒
Spring Sessionを使ったWebアプリケーションを開発中。
セッションレプリケーションにRedisを使用。
今回想定外のエラーに出くわしたのでメモ。
データクラスを新規に作成し、クラスごとセッションにセットする修正を行い、サーバーにデプロイ。
バグがあったため、前回のバージョンでデプロイしなおし。
セッションレプリケーションしているので、サービス自体は無停止でデプロイしなおし。
ここでエラーが発生。
デプロイ自体は問題なく出来ているんですが、アクセス中だったユーザーのリクエストが500エラー。
エラー内容は、
org.springframework.data.redis.serializer.SerializationException: Cannot deserialize;
nested exception is java.lang.ClassNotFoundException:
※エラーの一部のみ記載
正常に動いていた前のバージョンに戻したのにClassNotFoudException。
なぜ?
ここからはエラー内容からの勝手な想像になりますが、
・新バージョンをデプロイ(クラスAが新規に追加される)
・セッションの中にクラスAをセット。Redisに保存。
・クラスAが存在しないバージョンでデプロイしなおし。(RedisにはクラスAのデータが残っている)
・前バージョンでデプロイしなおし(クラスAがwarファイル上から消える)
・同一セッションで新しいリクエストを実行
・SpringがRedisからセッションデータをデシリアライズ
→クラスAなんて存在しないぞ(゚Д゚)ゴルァ!!
前バージョンのロジック上には当然クラスAなんて存在しないので、
セッションにクラスAが格納されていても問題ないと気にもしていませんでしたが、
まさかのClassNotFoudExceptionが発生。
SpringSessionは「セッション(HttpSession)」という1つの塊でRedisに保存しているのかな?
そのせいで使われないはずのクラスAのデータもわざわざデシリアライズしてエラーになっているんだと予想してます。
※SpringSessionの仕様、Redisの中身を確認したわけではないので、あくまで予想です
いちいちセッションの中身を全部デシリアライズしていたら、遅くなりそうな気がするが・・・。
セッションIDとキー名毎にRedisに保存してくれた方が早いだろうし、今回のようなエラーは発生しなかったような気が。
SpringSessionは初めて使ったのでどっか設定がイケてないのだろうか?
セッションレプリケーションにRedisを使用。
今回想定外のエラーに出くわしたのでメモ。
データクラスを新規に作成し、クラスごとセッションにセットする修正を行い、サーバーにデプロイ。
バグがあったため、前回のバージョンでデプロイしなおし。
セッションレプリケーションしているので、サービス自体は無停止でデプロイしなおし。
ここでエラーが発生。
デプロイ自体は問題なく出来ているんですが、アクセス中だったユーザーのリクエストが500エラー。
エラー内容は、
org.springframework.data.redis.serializer.SerializationException: Cannot deserialize;
nested exception is java.lang.ClassNotFoundException:
※エラーの一部のみ記載
正常に動いていた前のバージョンに戻したのにClassNotFoudException。
なぜ?
ここからはエラー内容からの勝手な想像になりますが、
・新バージョンをデプロイ(クラスAが新規に追加される)
・セッションの中にクラスAをセット。Redisに保存。
・クラスAが存在しないバージョンでデプロイしなおし。(RedisにはクラスAのデータが残っている)
・前バージョンでデプロイしなおし(クラスAがwarファイル上から消える)
・同一セッションで新しいリクエストを実行
・SpringがRedisからセッションデータをデシリアライズ
→クラスAなんて存在しないぞ(゚Д゚)ゴルァ!!
前バージョンのロジック上には当然クラスAなんて存在しないので、
セッションにクラスAが格納されていても問題ないと気にもしていませんでしたが、
まさかのClassNotFoudExceptionが発生。
SpringSessionは「セッション(HttpSession)」という1つの塊でRedisに保存しているのかな?
そのせいで使われないはずのクラスAのデータもわざわざデシリアライズしてエラーになっているんだと予想してます。
※SpringSessionの仕様、Redisの中身を確認したわけではないので、あくまで予想です
いちいちセッションの中身を全部デシリアライズしていたら、遅くなりそうな気がするが・・・。
セッションIDとキー名毎にRedisに保存してくれた方が早いだろうし、今回のようなエラーは発生しなかったような気が。
SpringSessionは初めて使ったのでどっか設定がイケてないのだろうか?
PR
Comment