【SpringBoot】Public final method [...] cannot get proxied via CGLIB, consider removing the final marker or using interface-based JDK proxies.警告をall-openで抑制する【Kotlin】

TL;DR

CGLIBからの題のような警告を抑制する場合、調べた限り以下のような方法があった。

  • interface
  • --add-opens java.base/java.lang=ALL-UNNAMED指定
  • open

これら全てに不適切感が有る場合、Kotlinならspringプラグイン経由でall-open対象にする対処法がある。

状況

SpringBootのアップデート後からPublic final method [...] cannot get proxied via CGLIB, consider removing the final marker or using interface-based JDK proxies.という警告が表示されるようになりました。
動作自体に問題は無さそうでしたが、量が多すぎるため抑制出来ないか検討することになりました。

調査した限りの対処方法では、まずinterfaceで定義する方法が見つかりましたが、対象クラスは様々な共通処理を定義したabstract classであったため、採用を見送りました。
また、--add-opens java.base/java.lang=ALL-UNNAMEDを指定する、対象になっている関数をopen化するなどありましたが、どちらも副作用が有るためあまり望ましくない状況でした。

対処

Kotlinall-openプラグインを適用することで、IDE上からはfinalなまま内部的にopen扱いできれば理想的かなと考えました。

Springの場合、実はspringプラグイン経由でall-openプラグインが導入されています。
@Component@Repositoryの付与されたクラスが適切に扱われるのはall-openが適用されているためです。

kotlinlang.org

ということで、対象クラスへall-open対象となるSpringのアノテーション(自分のケースでは@Repository)を付与することで、この問題を解消しました。
補足として、このクラスの実装側にも@Repositoryアノテーションは設定されていましたが、親クラス側の関数までopen化してくれるような効果は無かったです。