LoginSignup
3
5

More than 3 years have passed since last update.

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

Posted at

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以上かを確認
@NotNullList内の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;
  }
}
3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5