ConfigurationPropertiesとValidatedを使う


はじめに

  • 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 を省略
  • ConfigurationPropertiesValue アノテーションを省略
  • javax.validationMinMax を利用してバリデーション

最後に

  • @RequiredArgsConstructor + @ConstructorBinding の組み合わせが最高
  • if文を使わずにバリデーションできた