🎺

Spring のBean Validaiton 〜びーん ばりでーしょん〜

2 min read

Bean Validation

Spring Frameworkを使用し、REST通信を基本としたサンプルを記載する。

びーん ばりでーしょんって?

クライアントから送信されたRequestBodyの値をチェックする。
チェック内容は何種類かある。

  • Null
  • 空文字
  • 文字数
  • パターン(正規表現)
  • 最大サイズ
  • 最小サイズ

などなど...

とりあえずサンプル

コントローラでただバリデーションを実行するだけのサンプル。

SampleContorller.java
@RestController
@RequestMapping("validation")
public class SampleController {

  // バリデーションするだけ
  @PostMapping
  public SampleResource validation(
        @RequestBody @Validated SampleResource resource) {
    return resource;
  }
}
@Getter
@Setter
public class SampleResource {
  @NotNull
  @Size(min = 5, max = 30)
  @Pattern(regexp = "[a-zA-Z0-9]*")
  private String message;
}
アノテーション 説明
@NotNull Nullを禁止
@Size {min}以上{max}以下であることを確認する
@Pattern 指定パターンであることを確認する

more びーん ばりでーしょん

ネストしたクラスのバリデーション

フィールドに@Validを指定する。

SampleContorller.java
上のサンプルコントローラ一緒
@Getter
@Setter
public class SampleResource {
  @Valid
  @NotNull
  private SampleNestResource nestResource;
}

@Validでネストしたクラスのバリデーションを実行している。nestResourceが送信されてこない場合はフィールドにNullがバインドされてしまい、SampleNestResourceに指定したバリデーションが実行されないため、@NotNullで必須にしている。

@Getter
@Setter
public class SampleNestResource {
  @NotNull
  @Size(min = 5, max = 30)
  @Pattern(regexp = "[a-zA-Z0-9]*")
  private String message;
}

Collection内のチェック

ListなどのCollectionをフィールドに指定した場合、Collectionないのクラスのバリデーション指定とフィールドに対するバリデーションの指定が異なる。

SampleContorller.java
上のサンプルコントローラ一緒
@Getter
@Setter
public class SampleResource {
  
  @Size(min = 2)
  private List<@NotNull String> strList;
}

@SizeでフィールドのList要素が2以上かを確認
@NotNullでList内のStringがNullではないことを確認

バリデーションエラーのハンドリング

ハンドリングを行わない場合はMethodArgumentNotValidException が発生する。
RestControllerではBindingResultにエラーが入らないため、Errorsでエラー内容を取得する。

SampleContorller.java
@RestController
@RequestMapping("validation")
public class SampleController {

  // バリデーションするだけ
  @PostMapping
  public SampleResource validation(
        @RequestBody @Validated SampleResource resource,
        Errors errors) {
    if (errors.hasErrors()){
      throw new RuntimeException();
    }

    return resource;
  }
}
GitHubで編集を提案

Discussion

ログインするとコメントできます