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

IT

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

投稿日:

スポンサーリンク

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

お名前.comサイドバー