おおくまねこ

職業プログラマーです。興味のある話題を書いています。

SpringBoot で設定ファイルの値を Class に設定したい

背景

SpringBoot を使って、設定ファイルに値を入れて扱いたい場合が多く、

やり方を残しておきたいので記述します。

 

以下のような場合には、設定ファイルに切り出しておく方がよいかなと思っています。

  • URLやタイムアウト値などの頻繁に書き換える可能性のあるもの
  • 環境ごとに異なるものになる可能性場のあるもの

そうすることで、コード自体の変更が不要になるためです。

 

環境

今回使った環境は以下の通りです。

環境の記載はしていますが、それに依存するものではないので、

他のバージョンや環境でも同様に動作すると思います。

設定方法

設定方法について。

以下を

  • 依存パッケージの追加
  • 設定ファイルに項目を追加
  • 設定用のクラスを作成

依存パッケージの追加

build.gradle の依存関係に以下を設定します

dependencies {
// spring
implementation 'org.springframework.boot:spring-boot-starter-web'

// lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

// test
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.assertj:assertj-core'
}

spring-boot-starter-web させ入っていれば、今回の設定ファイルの読み込みはできるようです。

lombok は記述を楽にしたり、test 関係は確認用につかいたいためにいれています。

 

設定ファイルの追加

application.properties に以下のように設定します

app.sample.url=https://xxxx.com
app.sample.timeout=1000

 

application.yaml の場合は yaml 形式で記載すればいいですが、今回は properties ファイルで使っています。

 

設定用クラスの作成

Java のクラスを作成します。

今回つくったクラスは以下になります。

import lombok.Getter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;

@Getter
@ConstructorBinding
@ConfigurationProperties("app.sample")
public class PropSampleProperty {

private final String url;
private final int timeout;

public PropSampleProperty(String url, int timeout) {
this.url = url;
this.timeout = timeout;
}
}

 

設定ファイル用のクラス作成するときに、意識する必要な要素は以下です

  • ConfigrationPropertiesのアノテーションを付与、
    引数には前述した設定ファイルのキー名を渡します(今回は app.sample)
  • Setter メソッドの作成
    設定した値の方を変数に格納するためのメソッドを作成します
    おそらく、方法としては「lombok を使う」、「ConstructorBinding アノテーションを付与し、コンストラクターを作成する」の2つになるかと思います。
    今回はコンストラクターを作る方を使っています。理由としては、クラスの初期化のみで設定をよみこみ、Setterによる再設定を抑止することができるためです。
  • Getter メソッドの作成
    値を取り出すための Getter メソッドを作ります。
    lombok の Getter を使って代替しています。

動作確認

実際に設定がよみこめているか、動作確認します。

ロジックコード上で表示やデバッグしてもできますが、

今回はテストコードを書いて確認しました。

 

テストで実行する場合、設定ファイルはアプリケーション実行用とは別に、

「test/resources/application.properties」を用意します。

app.sample.url=https://xxxx.com
app.sample.timeout=1000

 

テストコード自体は以下になります。

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
@RunWith(SpringRunner.class)
public class PropSamplePropertyTest {
@Autowired
PropSampleProperty propSampleProperty;

@Test
public void urlTest() {
var actual = propSampleProperty.getUrl();
assertThat(actual).isEqualTo("https://xxxx.com");
}

@Test
public void timeoutTest() {
var actual = propSampleProperty.getTimeout();
assertThat(actual).isEqualTo(1000);
}
}

実際に実行し、正常に終了するのを確認できました。

 

最後に

設定の読み込み、その動作確認までできました。