はじめに
- Springで環境変数にバリデーションをかけたい方
- Springで実行時引数などでバリデーションをかけたい方に読んでいただきたいです
- 他にもよりよい実装があると思うので、参考程度にお読みください
- 今回はSpringBatchで実装していますが、SpringWebでも使えます
環境
利用ライブラリ | バージョン | 備考 |
---|---|---|
java | 11 | |
spring-boot-starter-parent | 2.3.0.RELEASE | |
org.projectlomok | 1.18.12 | javaの決まり文句を省略してくれて、コードディングが楽になるので使ってます |
javax.validation | 2.0.1.Final | バリデーションで利用 |
org.hibernate | 5.3.6.Final | バリデーションで利用 |
実装
要件
- バッチの実行時に引数として都道府県コード(1〜47)が渡される
- 都道府県コード以外が渡されたら、DBへSQLを叩かずにバッチを終了させたい
実装内容
環境変数や実行時引数参照用のPropertyクラスを作成する
SampleArgsProperties.java
@Validated
@lombok.Getter
@lombok.RequiredArgsConstructor
@ConstructorBinding
@ConfigurationProperties(prefix = "extension.sample.batch-alpha")
public class SampleBatchAlphaArgsProperties {
@NotNull
@Min(value = 1)
@Max(value = 47)
private final Integer areaCode;
@Nullable
@Min(value = 300)
private final Long hoge;
}
エラー
- javaの実行時引数に
50
を与えると以下のエラーが吐かれる-Dextension.sample.batch-alpha.area-code=50
Caused by: org.springframework.boot.context.properties.bind.validation.BindValidationException: Binding validation errors on extension.sample.batch-alpha
- Field error in object 'extension.sample.batch-alpha' on field 'areaCode': rejected value [50]; codes [...
説明
-
RequiredArgsConstructor
+ConstructorBinding
の組み合わせを利用しSetter
を省略 -
ConfigurationProperties
でValue
アノテーションを省略 -
javax.validation
のMin
やMax
を利用してバリデーション
最後に
-
@RequiredArgsConstructor
+@ConstructorBinding
の組み合わせが最高 - if文を使わずにバリデーションできた