【Spring Boot】Validation(@Valid)の使い方をやさしく解説

Java入門・実践
スポンサーリンク
スポンサーリンク

はじめに

Web API を作っていると必ず必要になるのが
入力チェック(バリデーション) です。

「名前は必須にしたい」
「メールアドレスの形式をチェックしたい」
「数値は 0 以上にしたい」

こういったルールを簡単に実現できるのが
Validation(@Valid) です。

この記事では、@Valid の使い方を
やさしく・実務で役立つ形 で整理していきます。

まずはコードを見て、そこから少しずつ理解していきましょう。

まずはコードを確認

Java
public class UserRequest {

    @NotBlank
    private String name;

    @Min(0)
    private int age;

    // getter / setter
}
Java
@PostMapping("/users")
public ResponseEntity<String> createUser(@Valid @RequestBody UserRequest request) {
    return ResponseEntity.ok("created");
}

このように、DTO にアノテーションを付けて、
Controller で @Valid を付けるだけで入力チェックが動きます。

コードのしくみを解説

@Valid とは

一言でいうと、

「このオブジェクトのバリデーションを実行してください」

という指示です。

Spring が

  • DTO のフィールドに付いたアノテーションを読み取り
  • 自動でチェックを実行し
  • エラーがあれば例外を投げてくれます

よく使うバリデーションアノテーション

代表的なものを整理します。

アノテーション意味
@NotBlank空文字禁止(null も不可)
@NotNullnull 禁止
@Size(min, max)文字数や配列のサイズ
@Emailメールアドレス形式
@Min / @Max数値の最小・最大
@Positive / @PositiveOrZero正の数
@Pattern正規表現

これだけで多くの入力チェックが書けます。

エラー時のレスポンスを整える

@Valid でエラーが起きると、
MethodArgumentNotValidException が発生します。

これを ControllerAdvice でキャッチすると、
きれいなエラーレスポンスを返せます。

Java
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, String>> handleValidation(MethodArgumentNotValidException e) {

        Map<String, String> errors = new HashMap<>();

        e.getBindingResult().getFieldErrors().forEach(error ->
            errors.put(error.getField(), error.getDefaultMessage())
        );

        return ResponseEntity.badRequest().body(errors);
    }
}

実務ではこの形がとてもよく使われます。

あわせて知っておきたいポイント

@RequestBody とセットで使うことが多い

JSON を DTO に変換するときに
@Valid が一緒に動きます。

@Validated との違い

  • @Valid → 基本的なバリデーション
  • @Validated → グループ分けなど高度なバリデーションが可能

まずは @Valid で十分です。

メッセージをカスタマイズできる

Java
@NotBlank(message = "名前は必須です")
private String name;

application.properties でメッセージを外出しできる

spring.messages.basename=messages

messages.properties に書くと管理しやすくなります。

使うときに気をつけたいこと

DTO にロジックを書かない

バリデーションは「ルール」だけを書く場所です。

Controller に if 文を書かない

@Valid と ControllerAdvice を使えば
try-catch や if 文は不要になります。

エラーメッセージは利用者目線で

API の利用者が理解しやすいメッセージにするのが実務的です。

まとめ

Validation(@Valid)は、
「DTO に付けたルールに従って入力チェックを自動で行う仕組み」
です。

  • DTO にアノテーションを付けるだけ
  • Controller で @Valid を付けるだけ
  • エラーは自動で例外に
  • ControllerAdvice と組み合わせると美しい API に

難しく聞こえますが、
「入力チェックを自動化するための仕組み」
と理解できれば十分です。


decopon
decopon

Validation を使いこなすと、API の品質が一気に上がります。
入力チェックをコードに散らばらせず、
DTO にまとめるだけで設計がとてもきれいになります。
あなたの開発が、今日より少しだけ楽になりますように。

moco
moco

入力をそっと見守ってくれるなんて…@Valid さん、やさしいね。

コメント

タイトルとURLをコピーしました