在 Java(尤其是 Spring Boot)里,用注解做校验通常是指 JSR-380(Bean Validation),最常用的是 jakarta.validation(以前是 javax.validation)。
下面从 基础 → 进阶 → 自定义 一步步讲。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
public class UserDTO {
@NotBlank(message = "用户名不能为空")
private String username;
@Email(message = "邮箱格式不正确")
private String email;
@Min(value = 18, message = "年龄不能小于18")
private Integer age;
// getter / setter
}
@RestController
public class UserController {
@PostMapping("/user")
public String addUser(@Valid @RequestBody UserDTO userDTO) {
return "ok";
}
}
✅ 请求参数不合法时,会自动返回 400
| 注解 | 说明 |
|---|---|
@NotNull |
不能为 null |
@NotBlank |
字符串非空且非空白 |
@NotEmpty |
集合 / 数组 / 字符串非空 |
@Size(min, max) |
长度范围 |
@Min / @Max |
数值范围 |
@Pattern |
正则校验 |
@Email |
邮箱 |
@Positive |
正数 |
@Past / @Future |
时间 |
public class OrderDTO {
@Valid
private UserDTO user;
@NotNull
private String orderNo;
}
⚠️ 必须加 @Valid,否则嵌套对象不会校验
public interface Add {}
public interface Update {}
public class UserDTO {
@Null(groups = Add.class)
@NotNull(groups = Update.class)
private Long id;
@NotBlank(groups = {Add.class, Update.class})
private String name;
}
public String save(@Validated(Add.class) @RequestBody UserDTO dto)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {
String message() default "手机号格式错误";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class PhoneValidator implements ConstraintValidator<Phone, String> {
public boolean isValid(String value, ConstraintValidatorContext context) {
return value != null && value.matches("^1[3-9]\\d{9}$");
}
}
@Phone
private String phone;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public Map<String, String> handle(MethodArgumentNotValidException e) {
Map<String, String> map = new HashMap<>();
e.getBindingResult().getFieldErrors()
.forEach(err -> map.put(err.getField(), err.getDefaultMessage()));
return map;
}
}
❌ 忘记 @Valid / @Validated
❌ DTO 没写 getter/setter
❌ 嵌套对象没加 @Valid
❌ Controller 参数不是对象(基本类型无法校验)
注解校验 = 实体加注解 + Controller 加 @Valid / @Validated + 异常处理
如果你用的是 Spring MVC / Spring Boot / 前端传参 / List 校验,可以告诉我具体场景,我给你写完整示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。