一、尝鲜
1.引入maven依赖
<!-- 实现了jdk的Validator、ConstraintValidator、Constraint接口,提供校验实现 -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>
<!-- 对hibernate-validator中不完善的校验规则进行补充 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
org.hibernate.validator:hibernate-validator和javax.validation:validation-api的关系:
- jdk提供了javax.validation
- 然后org.hibernate.validator:hibernate-validator实现了
- javax.validation:validation-api优化和补充了约束注解
2.编写demo
@Data
public class PersonDto {
@NotBlank(message = "姓名不能为空")
private String name;
@Min(value = 0, message = "年龄必须大于等于0")
private Integer age;
private String sex;
}
@RestController
@RequestMapping("/student")
public class StudentController {
@PostMapping("/add")
public String add(@RequestBody @Valid PersonDto personDto){
System.out.println(personDto);
return personDto.toString();
}
// valid对List不生效的解决办法:https://blog.csdn.net/onceing/article/details/110119877
@PostMapping("/addList")
public String add(@RequestBody @Valid ValidList<PersonDto> personDtoList){
System.out.println(personDtoList);
return personDtoList.toString();
}
}
/**
* controller异常切面
*/
@RestControllerAdvice
public class ExceptionAdvice {
/**
* 配合@Valid或@Validated注解使用,当请求参数不合法是,则会抛出MethodArgumentNotValidException异常,从而被这个异常处理器捕获。
* 然后返回自定义错误信息
* @param e 参数不合法异常
* @return 自定义错误信息
*/
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseVo<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
String errorMsg = allErrors.stream().map(error -> error.getDefaultMessage()).collect(Collectors.joining(","));
return ResponseVo.fail(errorMsg);
}
}
二、使用总结
1. 生效机制
@Valid只适用于校验入参为对象类型,它会校验对象的属性是否符合约束;如果入参是String或者Integer等包装类是不能触发校验框架的。
如下图所示,因为入参是String,所以即使id为Blank还是能进入到方法中,说明@Valid是没有生效的
2.属性为对象类型
如果对象的属性是对象类型,并且要校验,要对对象类型的属性加上@Vaild
3.其他要注意的地方
- 对于String类型的属性要用@NotBlank,不要用@NotNull。
@NotBlank相当于StringUtil.isNotBlank,@NotNull相当于str != null