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);
}
}
実際に実行し、正常に終了するのを確認できました。
最後に
設定の読み込み、その動作確認までできました。