1.引入依赖
<!-- 参数校验依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.字段添加校验注解
@Data
@ApiModel("用户视图模型")
public class UserVo {
@ApiModelProperty("主键")
@DecimalMax(value = "99",message = "id 不能大于99")
private Integer id;
@ApiModelProperty("姓名")
@NotBlank(message = "name 不能为空")
private String name;
@ApiModelProperty("年龄")
@NotNull(message = "age 不能为null")
private Integer age;
@NotEmpty(message = "sex 不能为空")
private String sex;
@Size(max = 11)
private String phone;
}
3.编写测试控制器
@RestController
@RequestMapping("vilidation")
@Api(tags = "参数校验测试")
public class VilidationController {
@ApiOperation("表单格式接口")
@GetMapping("form")
public R form(@Valid UserVo userVo, BindingResult bindingResult){
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
List<String> collect = fieldErrors.stream().map(o -> o.getDefaultMessage()).collect(Collectors.toList());
return R.error().code(HttpStatus.BAD_REQUEST.value()).message("请求参数错误").data("list",collect);
}
}
考虑到每个接口都要有绑定结果接口BindingResult做为参数来获取错误信息非常繁琐,我们可以用全局异常处理。
4.全局异常处理
全局异常处理类:
@RestControllerAdvice
public class GlobalControllerAdvice {
private static final String BAD_REQUEST_MSG = "客户端请求参数错误";
// <1> 处理 form data方式调用接口校验失败抛出的异常
@ExceptionHandler(BindException.class)
public R bindExceptionHandler(BindException e) {
List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
List<String> collect = fieldErrors.stream()
.map(o -> o.getDefaultMessage())
.collect(Collectors.toList());
return R.error().message("表单参数错误").code(HttpStatus.BAD_REQUEST.value()).
data("list",collect);
}
// <2> 处理 json 请求体调用接口校验失败抛出的异常
@ExceptionHandler(MethodArgumentNotValidException.class)
public R methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
List<String> collect = fieldErrors.stream()
.map(o -> o.getDefaultMessage())
.collect(Collectors.toList());
return R.error().message("json格式参数错误").code(HttpStatus.BAD_REQUEST.value()).
data("list",collect);
}
// <3> 处理单个参数校验失败抛出的异常
@ExceptionHandler(ConstraintViolationException.class)
public R constraintViolationExceptionHandler(ConstraintViolationException e) {
Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();
List<String> collect = constraintViolations.stream()
.map(o -> o.getMessage())
.collect(Collectors.toList());
return R.error().message("单参数格式错误").code(HttpStatus.BAD_REQUEST.value()).
data("list",collect);
}
}
控制器类:
@RestController
@RequestMapping("vilidation")
@Api(tags = "参数校验测试")
@Validated
public class VilidationController {
@ApiOperation("表单格式接口")
@GetMapping("form")
public R form(@Validated UserVo userVo){
return R.ok().data("uservo",userVo);
}
@ApiOperation("json格式接口")
@PostMapping("json")
public R json(@Valid @RequestBody UserVo userVo){
return R.ok().data("uservo",userVo);
}
@ApiOperation("单参数接口")
@GetMapping("single")
public R single( @NotBlank(message = "id不能为空") String id,
@NotBlank(message = "请输入用户名") String username){
return null;
}
}
也可以对请求方式异常及Json格式请求体缺失异常进行处理:
5.分组校验
两者的不同效果原因在于Update分组继承了Defualt,Save分组没继承,而
校验注解默认都是Default分组。
6.嵌套验证
7.校验注解说明及@Valid与@Validated的区别