Spring Bootを使用して以下のようなバリデーションを想定します。
nullと空文字それぞれで挙動を確認します。
public class SampleRequest {
@NotBlank(message = "空白です")
@Size(max = 10, min = 10, message = "10桁で入力してください")
@Positive(message = "正の数を入力してください")
private String number;
}
@RestController
@RequestMapping("/api/v1")
public class SampleController {
@PostMapping(value = "/hello")
public String post(@RequestBody @Validated SampleRequest request) {
return "hello";
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<List> handleError(MethodArgumentNotValidException exception) {
List<String> messages = exception.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage).toList();
return ResponseEntity.badRequest().body(messages);
}
}
nullの場合
nullをPOSTした場合は以下のレスポンスが返ってきます。
response
["空白です"]
これにより以下のことがわかります。
- nullの場合は
@NotBlank
にひっかかります。 - nullの場合は対象が存在しないため、
@Size
、@Positive
で検証されません。
空文字の場合
空文字をPOSTした場合は以下のレスポンスが返ってきます。
response
["空白です","10桁で入力してください","正の数を入力してください"]
これにより以下のことがわかります。
- 空文字の場合は
@NotBlank
にひっかかります。 - 空文字の場合はサイズ0の文字列として扱われるため、
@Size
、@Positive
でもひっかかります。
バリデーション時にnullと空文字それぞれで挙動は異なることがわかりました。