0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

アノテーションの引数を設定ファイルから取り出したい

Posted at

やりたいこと

タイトルのままだが、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?
)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?