1 导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2 创建Peson类
package com.aion.validdemo.dto;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.*;
@Data
public class Person {
@NotNull(message = "name不能为空")
@NotBlank(message = "name不能为空字符串")
private String name;
@NotNull(message = "age不能为空")
// @Size不能用于验证int类型的数据
// @Size(max = 100, min = 1, message = "年龄只能在0~100之间")
// @Min(value = 0, message = "age不能小于0")
// @Max(value = 100, message = "age不能大于100")
@Range(max = 100, min = 0, message = "age只能在0~100之间")
private int age;
// @NotNull(message = "sex不能为空")
@Pattern(regexp = "[男|女]{1}", message = "sex只能为男或女")
private String sex;
}
3 验证
在控制器的中要验证的参数加上@Validated注解,同过在参数result的hasErrors()方法判断是否有错误信息,有则打印错误信息,没有则正常返回获取的person数据。
@RestController
public class PersonController {
@RequestMapping("/person")
public Map<String, Object> person(@Validated @RequestBody Person person, BindingResult result){
Map<String, Object> map = new HashMap<>();
if (result.hasErrors()){
// 获取错误信息列表,并装入map中
map.put("errors", result.getAllErrors().stream().map(e -> e.getDefaultMessage()).collect(Collectors.toList()));
} else {
map.put("person", person);
}
return map;
}
}
验证成功:
验证失败:
4 改进
在控制器中进行验证时对于多数验证不通过的情况我们只返回验证错误信息,如果有大量的控制器进行数据验证,会导致代码耦合。
在使用中我们会发现当验证不通过时会抛出MethodArgumentNotValidException
异常,我们可以使用自定义全局异常处理器,并使用@ExceptionHandler捕获MethodArgumentNotValidException异常,并使用它返回验证错误信息;
示例如下:
@RestControllerAdvice
public class GErrorController {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public Map<String, Object> valid(MethodArgumentNotValidException e){
Map<String, Object> map = new HashMap<>();
map.put("message", "valid error");
// 获取错误信息列表
List<String> errors = e.getAllErrors().stream().map(error -> error.getDefaultMessage()).collect(Collectors.toList());
map.put("e", errors);
return map;
}
}
注意 要移除掉public Map<String, Object> person(@Validated @RequestBody Person person, BindingResult result)
方法中的BindingResult result
参数
验证通过:
验证失败: