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

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

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

YouTubeも見てね♪

ねこじゃすり

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の思い出を撮影しよう!

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

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

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

レッドブル エナジードリンク 250ml×24本

created by Rinker
Red Bull(レッドブル)
¥4,000 (2025/01/05 12:33:39時点 Amazon調べ-詳細)

翼を授けよう!

モンスターエナジー 355ml×24本 [エナジードリンク]

created by Rinker
モンスター
¥4,718 (2025/01/05 12:33:40時点 Amazon調べ-詳細)

脳を活性化させるにはこれ!

ドラゴンクエスト メタリックモンスターズギャラリー メタルキング

created by Rinker
スクウェア・エニックス(SQUARE ENIX)
¥3,940 (2025/01/05 12:41:47時点 Amazon調べ-詳細)

みんな大好き経験値の塊をデスクに常備しておこう!

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を組み合わせて利用する可能性がある方は是非覚えておくと良いでしょう♪

CATEGORIES & TAGS

IT