やりたいこと
タイトルのままだが、SpringBootで使うアノテーションの引数に、設定ファイルで定義した値を代入したい。
しかし普通に代入するとエラーが出て、うまく実行できない。
具体的には以下のような状況。
application.yml
config:
cron: 0 0 0 * * *
HogeConfig.kt
@Component
@ConfigurationProperties("config")
class HogeConfig() {
var cron = ""
}
Foo.kt
@Component
class Foo(
val hogeConfig: HogeConfig
) {
@Scheduled(cron = hogeConfig.cron)
fun bar(){
}
}
関数の中などで使う場合は、DIコンテナからとってきた HogeConfig
インスタンスをそのまま使えるのだが、アノテーションでは使うことができない。
出てくるエラーはこんな感じ。
an annotation argument must be a compile-time constant
アノテーションの引数はコンパイル時に定数である必要があるらしい。
HogeConfig
インスタンスが作成されるのは @ComponentScan
が付与されたクラスが実行されたタイミングであるため、上記の場合コンパイル時に存在しないのだ。(多分)
解決策
これを解決するためには Foo.kt
を以下のように修正する。
Foo.kt
@Component
class Foo() {
@Scheduled(cron = "\${config.cron}")
fun bar(){
}
}
このようにすることでSpringBootがコンパイル時に設定ファイルから定数を引っ張ってきてくれるようになる。
また同じようなケースで、フォームバリデーションでエラーメッセージをmessage.propertiesから引っ張って来たい時がある。
この時は以下のようにすると代入できる。
messages.properties
valid.NotBlank = 空白は許可されていません
valid.Size = 文字数を{max}以下にしてください
Form.kt
data class Form (
@field:NotBlank(message = "{valid.NotBlank}")
@field:Size(max = 50, message = "{valid.Size}")
val userName: String?
)