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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Bean Validation:@NotNull、@Size、@Pattern
- カスタム制約アノテーション
- @ControllerAdviceによるグローバル例外処理
- RFC 7807 Problem Detailsと一貫したエラーレスポンス