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);
}