0Pricing
Java Academy · レッスン

Bean Validation:@NotNull、@Size、@Pattern

DTOにBean Validationの制約を付け、コントローラーで@Validを使ってバリデーションを実行します。

「Bean Validation:@NotNull、@Size、@Pattern」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

Bean Validation とは

Bean Validation(Jakarta Bean Validation 3.0)は、Java bean に対する宣言的な制約アノテーションを提供します。Spring Boot はバリデーターを自動構成し、@Valid または @Validated を通じて検証を実行します。

@NotNull、@NotEmpty、@NotBlank

@NotNull: 値が null でないことを検証します。@NotEmpty: null でなく、空でないことを検証します(文字列やコレクションが対象です)。@NotBlank: null でなく、空でなく、空白だけではないことを検証します。文字列には @NotBlank を優先してください。

public record CreateUserRequest(
    @NotBlank(message = "Name is required")
    String name,
    @NotBlank @Email
    String email,
    @NotNull
    UserRole role
) {}

@Size と @Length

@Size(min, max) は、文字列、コレクション、マップ、配列のサイズを制約します。@Length(Hibernate)は文字列にのみ使用できます。移植性を考慮し、@Size を優先してください。

@Size(min = 3, max = 50, message = "Name must be 3-50 characters")
private String name;
@Size(min = 1, max = 10, message = "Cart must have 1-10 items")
private List<CartItem> items;

@Min、@Max、@Positive、@Range

数値に対する制約には、厳密な上下限を指定する @Min/@Max、符号を制約する @Positive/@PositiveOrZero、BigDecimal に使用する @DecimalMin/@DecimalMax があります。

@Min(1) @Max(100)
private int quantity;
@DecimalMin("0.01") @DecimalMax("99999.99")
private BigDecimal price;
@Positive
private long orderId;

正規表現による検証に使う @Pattern

@Pattern(regexp) は、正規表現に対して文字列を検証します。電話番号、郵便番号、独自形式の検証に役立ちます。

@Pattern(regexp = "^\\+?[1-9]\\d{7,14}$", message = "Invalid phone number")
private String phone;
@Pattern(regexp = "^[A-Z]{2}\\d{5}$", message = "Invalid postal code (e.g. AB12345)")
private String postalCode;

@Email と @URL

@Email はメールアドレスの形式(基本的な RFC 5321)を検証します。@URL(Hibernate)は URL の形式を検証します。これらは null を許容するため、必ず @NotBlank と組み合わせてください。

@NotBlank @Email
private String email;
// Hibernate-specific:
@URL(protocol = "https")
private String profileUrl;

@Past、@Future、@PastOrPresent

日時に関する制約は、日付や時刻の値を検証します。LocalDate、LocalDateTime、Instant などに使用できます。

@Past(message = "Birth date must be in the past")
private LocalDate birthDate;
@Future(message = "Expiry must be in the future")
private LocalDate expiryDate;

@Valid による検証の実行

コントローラーメソッドのパラメーターに @Valid を追加します。Spring はオブジェクトを検証し、検証に失敗すると MethodArgumentNotValidException をスローして、400 Bad Request を返します。

@PostMapping("/users")
public ResponseEntity<UserDto> create(@Valid @RequestBody CreateUserRequest req) {
    User user = userService.create(req);
    return ResponseEntity.status(201).body(UserDto.from(user));
}

フィールドの @Valid によるカスケード検証

ネストしたオブジェクトを検証するには、クラスレベルの制約に加えて、フィールドにも @Valid を付けます。

public record OrderRequest(
    @NotNull @Valid
    AddressRequest shippingAddress, // validates AddressRequest constraints too
    @Valid @NotEmpty
    List<@Valid LineItemRequest> items
) {}

バリデーショングループ

グループを使用すると、コンテキストごとに異なる制約を適用できます(例: 作成と更新)。グループインターフェースを指定してアノテーションを付け、@Validated(CreateGroup.class) で検証を実行します。

public interface CreateGroup {}
public interface UpdateGroup {}
public record UserRequest(
    @NotBlank(groups = CreateGroup.class) String password,
    @NotNull(groups = UpdateGroup.class)  Long id
) {}
// Controller:
@PutMapping("/{id}")
public UserDto update(@Validated(UpdateGroup.class) @RequestBody UserRequest req) { ... }

検証エラーの読み取り

@ControllerAdvice で MethodArgumentNotValidException を捕捉し、フィールドエラーを取り出して構造化されたエラーレスポンスを作成します。

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidation(MethodArgumentNotValidException ex) {
    Map<String, String> errors = new LinkedHashMap<>();
    ex.getBindingResult().getFieldErrors().forEach(e ->
        errors.put(e.getField(), e.getDefaultMessage()));
    return ResponseEntity.badRequest().body(errors);
}

確認問題

String が null でなく、空白だけでもないことを検証するアノテーションはどれですか?

まとめ

DTO に Bean Validation の制約を付けます。コントローラーに @Valid を追加して検証を実行します。文字列には @NotBlank、長さには @Size、正規表現には @Pattern、日付には @Past/@Future を使用します。エラーは @ControllerAdvice で処理します。

よくある質問

「Bean Validation:@NotNull、@Size、@Pattern」レッスンは無料ですか?

はい。「Bean Validation:@NotNull、@Size、@Pattern」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「Bean Validation:@NotNull、@Size、@Pattern」で何を学びますか?

DTOにBean Validationの制約を付け、コントローラーで@Validを使ってバリデーションを実行します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「Bean Validation:@NotNull、@Size、@Pattern」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Bean Validation:@NotNull、@Size、@Pattern
  2. カスタム制約アノテーション
  3. @ControllerAdviceによるグローバル例外処理
  4. RFC 7807 Problem Detailsと一貫したエラーレスポンス
← Java Academyに戻る