きり丸の技術日記

技術検証したり、資格等をここに残していきます。

SpringBootの@Valueではstatic変数には設定できない(設定ファイルの値をstatic変数に設定できるようにする)

SpringBootの@Valueを使用すると、設定ファイルの値を取得して変数に設定できます。しかし、static変数に関しては直接的に@Valueで設定できません。

今回の記事では、設定ファイルの値をstatic変数にも設定できるようにします。

前提

  • org.springframework.boot
    • 2.7.0
  • lombok

対応

static変数でなければ、@Valueは動きます。そのため、コンストラクタで@Valueし、コンストラクタでstatic変数に設定できます。

直接取得

@SpringJUnitConfig
@TestPropertySource(properties = {"domain=kirimaru"})
class StaticSpringValue {
private static String actual;
  public StaticSpringValue(@Value("${domain}") String actual) {
    StaticSpringValue.actual = actual;
  }
}

Beanを経由して取得

@SpringJUnitConfig
@TestPropertySource(properties = {"domain=kirimaru"})
class StaticSpringValue {
  private static String actual;

  @Autowired
  StaticSpringValueBean bean;

  public StaticSpringValue(@Value("#{TestBean.actual}") String actual) {
    StaticSpringValue.actual = actual;
  }

  @Data
  @TestConfiguration(value = "TestBean")
  public static class StaticSpringValueBean {
    @Value("${domain}")
    private String actual;
  }
}

ソースコード

テストコードで動作確認しています。

終わりに

普段、Beanを使用してstatic変数は意図的に使用しないのですが、static変数を使用しているプロジェクトに配属されたためちょっとだけハマりました。

IDEでもstatic変数に@Valueを付けたら警告出してほしいですね。SonarQube等々の静的解析では検出してくれるのでしょうか。2回目以降はハマらないように気を付けたいですね。

参考情報