1.导入依赖

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

2.实体类或方法参数上添加校验的注解

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private Integer id; //ID
    @NotBlank(message = "姓名不能为空")
    @Size(min = 2,max = 10,message = "姓名长度在2-10之间")
    private String name; //姓名
    @NotBlank(message = "学号不能为空")
    @Size(min = 6,max = 12,message = "学号长度在6-12之间")
    private String no; //序号
    @NotNull(message = "性别不能为空")
    private Integer gender; //性别 , 1: 男 , 2 : 女
    @NotNull(message = "手机号不能为空")
    //^开始 $结束 []枚举, \d数字, {数量}  {3,9} =>最少3位,最多9位
    @Pattern(regexp = "^1[3-9]\\d{9}$",message = "手机号格式不正确")
    //@Length(min = 11,max = 11,message = "手机号长度为11")
    private String phone; //手机号
    @NotNull(message = "身份证号不能为空")
    @Pattern(regexp = "^\\d{17}[0-9X]$",message = "身份证为18位数字")
    private String idCard; //身份证号
    @NotNull(message = "是否来自院校不能为空")
    private Integer isCollege; //是否来自于院校, 1: 是, 0: 否
    @Length(max = 100,message = "联系地址最多100个字符")
    private String address; //联系地址
    @Min(value = 1,message = "学历不能为空")
    @Max(value = 6,message = "学历不能超过博士")
    private Integer degree; //最高学历, 1: 初中, 2: 高中 , 3: 大专 , 4: 本科 , 5: 硕士 , 6: 博士
    @Past(message = "毕业时间必须为过去时间")
    private LocalDate graduationDate; //毕业时间
    @NotNull(message = "班级不能为空")
    private Integer clazzId; //班级ID
    private Short violationCount; //违纪次数
    @Max(value = 100,message = "违纪扣分不能超过100")
    private Short violationScore; //违纪扣分
    private LocalDateTime createTime; //创建时间
    private LocalDateTime updateTime; //修改时间

    private String clazzName;//班级名称
}

3.1在Controller类上或方法上添加@Valid或@Validated注解

实体对象@Valid

/**
 * 添加学员
 */
@LogOperation //自定义注解(表示:将当前操作方法加入日志信息)
@PostMapping
public Result add(@Valid @RequestBody Student student){
    studentService.insert(student);
    return Result.success();
}

3.2在属性前加 @Positive(message = "分数不能为空或者负数")判断正数

单个字段@Positive

/**
 * 违纪扣分
 */
@LogOperation //自定义注解(表示:将当前操作方法加入日志信息)
@Validated
@PutMapping("violation/{id}/{score}")
public Result updateScore(@PathVariable Integer id, @Positive(message = "分数不能为空或者负数") @PathVariable  Integer score){
    studentService.updateScore(id,score);
    return Result.success();
}

4.全局异常处理捕获校验失败信息,进行友好提示
1.实体对象 MethodArgumentNotValidException

    //处理自定义异常(Student实体对象---参数校验失败)
    @ExceptionHandler
    public Result handlerMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        //校验没通过的字段
        List<ObjectError> allErrors = e.getAllErrors();
        if (!CollectionUtils.isEmpty(allErrors)) {
//            StringJoiner joiner = new StringJoiner(";");//拼接字符串,以分号拼接
//            for (ObjectError error : allErrors) {
//                String msgInfo = error.getDefaultMessage();
//                joiner.add(msgInfo);
//            }
            String errorInfo = allErrors.stream().map(ObjectError::getDefaultMessage).collect(Collectors.joining(";"));
            return Result.error(errorInfo);
        }
        return Result.error("参数校验失败");
    }

2.单个参数 HandlerMethodValidationException

//处理自定义异常(单个参数---违纪扣分不能为空或负数)
@ExceptionHandler
public Result handleHandlerMethodValidationException(HandlerMethodValidationException e) {
    List < ? extends MessageSourceResolvable> errors = e.getAllErrors();
    String errorInfo = errors.stream().map(MessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(";"));
    return Result.error(errorInfo);
}
最后修改:2025 年 09 月 09 日
如果觉得我的文章对你有用,请随意赞赏