温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何用注解做校验

发布时间:2026-10-22 23:23:09 来源:亿速云 阅读:105 作者:小樊 栏目:编程语言

在 Java(尤其是 Spring Boot)里,用注解做校验通常是指 JSR-380(Bean Validation),最常用的是 jakarta.validation(以前是 javax.validation)。

下面从 基础 → 进阶 → 自定义 一步步讲。


一、基础用法(最常用)

1️⃣ 引入依赖(Spring Boot 已内置)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2️⃣ 在实体类上使用校验注解

public class UserDTO {

    @NotBlank(message = "用户名不能为空")
    private String username;

    @Email(message = "邮箱格式不正确")
    private String email;

    @Min(value = 18, message = "年龄不能小于18")
    private Integer age;

    // getter / setter
}

3️⃣ 在 Controller 中开启校验

@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,否则嵌套对象不会校验


四、分组校验(不同场景不同规则)

1️⃣ 定义分组接口

public interface Add {}
public interface Update {}

2️⃣ 使用分组

public class UserDTO {

    @Null(groups = Add.class)
    @NotNull(groups = Update.class)
    private Long id;

    @NotBlank(groups = {Add.class, Update.class})
    private String name;
}

3️⃣ Controller 指定分组

public String save(@Validated(Add.class) @RequestBody UserDTO dto)

五、自定义校验注解(高级)

1️⃣ 定义注解

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {
    String message() default "手机号格式错误";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

2️⃣ 校验逻辑

public class PhoneValidator implements ConstraintValidator<Phone, String> {
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value != null && value.matches("^1[3-9]\\d{9}$");
    }
}

3️⃣ 使用

@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 校验,可以告诉我具体场景,我给你写完整示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手