素敵なサムシングを独断と偏見で一方的に紹介するブログ(´・ω・`)

IT

投稿日: 2020年12月17日
最終更新日:

【循環参照】Lombokで生成した@Data(@ToString)でjava.lang.StackOverflowError: nullが発生する原因と解決方法【Java】

ねこじゃすり

created by Rinker
PEPPY(ペピイ)
¥3,850 (2025/01/05 12:56:12時点 Amazon調べ-詳細)

猫を魅了する魔法の装備品!

Anker PowerCor

created by Rinker
Anker
¥3,990 (2025/01/05 12:09:11時点 Amazon調べ-詳細)

旅行には必須の大容量モバイルバッテリー!

【最新機種】GoPro hero11 Black

created by Rinker
¥61,300 (2025/01/05 20:59:47時点 楽天市場調べ-詳細)

最新機種でVlogの思い出を撮影しよう!

[ノースフェイス] THE NORTH FACE メンズ アウター マウンテンライトジャケット

created by Rinker
THE NORTH FACE(ザノースフェイス)
¥33,000 (2025/01/05 13:22:08時点 Amazon調べ-詳細)

防水暴風で耐久性抜群なので旅行で大活躍です!

ペヤング ソースやきそば 120g×18個

created by Rinker
ペヤング
¥3,280 (2025/01/05 12:33:38時点 Amazon調べ-詳細)

とりあえず保存食として買っておけば間違いなし!

MOFT X 【新型 ミニマム版】 iPhone対応 スマホスタンド

Amazon一番人気のスマホスタンド!カード類も収納出来てかさ張らないのでオススメです!

サンディスク microSD 128GB

スマホからSwitchまで使える大容量MicroSDカード!

スポンサーリンク

336×280




JPAオブジェクトのLombokでStackOverflowErrorが発生

循環参照が発生しメモリリーク

JPA+Lombokを組み合わせて利用している際に、以下のようなJPAで取得した親子関係を持つEntityオブジェクトを標準出力や文字列化、エラーログ出力時にそのまま渡してtoString()メソッドを呼び出した際にjava.lang.StackOverflowError: nullが発生する場合があります。

ログを見てもらうとわかる通り、toStringを実行した際に依存している子モデルtoStringが呼ばれ、その中のさらに依存している親モデルtoStringが呼ばれ・・・という形で無限ループしてしまっています。

解決方法

@ToString.Excludeを使う

この現象を避けるには、子Entity側のtoStringで親EntityのtoStringを呼ばないようにする必要があります。

幸い、Lombokでは上記を実装するための便利なアノテーションがあるのでそちらを利用しましょう。

toStringから除外したいフィールドに以下をつけるだけです。

これで循環参照がされなくなるので、正常にtoStringメソッドを呼び出す事が可能になりました。

@ToString(exclude = {“XXX”})は非推奨

ちなみにクラスに対して@ToString(exclude = {"除外対象の親Entityプロパティ名"})とする事でも同様の処理をする事が可能だが、こちらの記述方法は非推奨のためいずれ無くなるらしいので使わないことをオススメします。

終わりに

以上のように循環参照の恐怖を知っていないと、サーバーが落ちてしまう原因の一つとなってしまいます。

LombokとJPAを組み合わせて利用する可能性がある方は是非覚えておくと良いでしょう♪

336×280




336×280




CATEGORIES & TAGS

IT, , , , , , , , , , ,

blogenist

Author: blogenist

関連記事

YouTubeも見てね♪