为了避免复杂的if/else校验,可以使用@Valid/@Validated注解来简化,使之更美观。
当使用@Valid或@Validated注解来触发校验时,如果校验失败,Spring会抛出异常。
- 可以使用@RestControllerAdvice注解来定义一个全局异常处理器来捕获MethodArgumentNotValidException
- 也可以在Controller的方法中添加BindingResult参数来直接访问校验结果
使用步骤:
- 添加依赖,springboot项目无需添加,已经包含spring-boot-starter-web中
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
- 实体类中添加@Valid相关注解
public class StudentDTO {
//新增组
public interface addGroup{
}
//更新组
public interface updateGroup{
}
@NotBlank(message = "id不能为空", groups = {updateGroup.class})
private String id;
@NotBlank(message = "人名不能为空", groups = {addGroup.class})
private String name;
@NotBlank(message = "地址不能为空")//这里没给分组,想要起作用,下面的接口中要加Default.class
private String address;
}
- 接口类中添加@Valid注解(因为使用了分组,所以使用的是@Validated)
@PostMapping("/addStudent")
R addStudent(@RequestBody @Validated({StudentDTO.addGroup.class, Default.class}) StudentDTO dto) {
return StudentService.addStudent(dto);
}
@PutMapping("/updateStudent")
R updateStudent(@RequestBody @Validated({StudentDTO.updateGroup.class}) StudentDTO dto) {
return StudentService.updateStudent(dto);
}
- 全局异常处理抛出的异常 或者 直接在接口方法中处理
ps:下面的JsonResult是项目中的统一结果集响应的实体类,换掉即可
全局异常处理:
@RestControllerAdvice
public class MapExceptionHandler{
@ExceptionHandler(MethodArgumentNotValidException.class)
public JsonResult handlerEx(MethodArgumentNotValidException ex) {
List<ObjectError> allErrors = ex.getBindingResult().getAllErrors();
List<String> resultList = new ArrayList<>();
for (ObjectError objectError : allErrors) {
resultList.add(objectError.getDefaultMessage());
}
return new JsonResult().error(String.join(",", resultList));
}
}
或者
直接在接口方法中处理:
@RestController
public class StudentController {
@PostMapping("/addStudent")
R addStudent(@RequestBody @Validated({StudentDTO.addGroup.class}) StudentDTO dto, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
String message = bindingResult.getAllErrors().get(0).getDefaultMessage();
return R.error(message);
}
return StudentService.addStudent(dto);
}
}
附:
一些常用的参数校验注解
@Null:为null
@NotNull:不为null
@NotEmpty:不为null,且长度必须大于0,用于集合校验
@NotBlank:不为null,并且经过trim操作后,字符串长度也大于0,用于String校验
@Min(value):必须是一个数(可以为数值类型或String类型,其中数值类型建议使用包装类),且其值>=指定的最小值
@Min(value = 18, message = "必须大于等于18")
private Integer age;
@Max(value):必须是一个数(可以为数值类型或String类型,其中数值类型建议使用包装类),且其值<=指定的最大值。
@Range(max =3 , min =1):必须是一个数(可以为数值类型或String类型,其中数值类型建议使用包装类),且是否介于(包括)指定的最小值和最大值之间
@Range(min = 10, max = 20, message = "年龄必须在10-20之间")
private Integer age;
@Size(max,min):验证对象(Array,Collection,Map,String)长度是否在给定的范围之内。
@Size(min = 10, max = 20, message = "长度必须在10-20之间")
private String name;
@Email:验证注解的元素是否是一个有效的email地址。
也可以自定义注解,因为本人暂时没用到,所以先不写。
可以参考别的大佬写的:
https://blog.csdn.net/m0_58680865/article/details/127817779