1.导包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
2.实体校验类型
@AllArgsConstructor @NoArgsConstructor @Data @ToString public class Websites implements Serializable { private static final long serialVersionUID = 4162334049119728731L; private Integer id; @NotNull(message = "name不能为空") private String name; @NotNull(message = "url不能为空") private String url; @NotNull(message = "alexa不能为空") private Integer alexa; @NotNull(message = "country不能为空") private String country; }
/** * 保存一个网址对象 * http://localhost:8080/saveWebsites */ @PostMapping("/saveWebsites") public String saveWebsites(@RequestBody @Valid Websites websites) { // 判断是否含有校验不匹配的参数错误 /*if (bindingResult.hasErrors()) { // 获取所有字段参数不匹配的参数集合 List<FieldError> fieldErrorList = bindingResult.getFieldErrors(); Map<String, Object> result = new HashMap<>(fieldErrorList.size()); fieldErrorList.forEach(error -> { // 将错误参数名称和参数错误原因存于map集合中 result.put(error.getField(), error.getDefaultMessage()); }); log.info("============判断是否含有校验不匹配的参数错误=============="); return result.toString(); }*/ log.info("======================是否执行"); boolean flag = websitesService.saveWebsites(websites); if (flag) { log.info(websites.toString()); } else { log.info("保存失败"); } return "hello,world!" + flag; }
3.单值校验
注意在类上面添加 @Validated
@Slf4j @RestController @Validated public class IndexController { @CrossOrigin @PostMapping("/index") public String index(@NotNull(message = "username不能为空") String username) { //String a = URLEncoder.encode(username); //a = URLDecoder.decode(username); log.info("==============" + username); return username; } }
4.全局捕获校验异常
/** * 单个参数校验异常 */ @ExceptionHandler(ConstraintViolationException.class) public List<String> constraintViolationException(ConstraintViolationException e) { log.error("单个参数校验异常"); List<String> defaultMsg = e.getConstraintViolations() .stream() .map(ConstraintViolation::getMessage) .collect(Collectors.toList()); return defaultMsg; } /** *实体参数校验 * @param e * @return */ @ExceptionHandler(MethodArgumentNotValidException.class) public Map<String, Object> methodArgumentNotValidException(MethodArgumentNotValidException e){ BindingResult bindingResult = e.getBindingResult(); // 获取所有字段参数不匹配的参数集合 List<FieldError> fieldErrorList = bindingResult.getFieldErrors(); Map<String, Object> result = new HashMap<>(fieldErrorList.size()); fieldErrorList.forEach(error -> { // 将错误参数名称和参数错误原因存于map集合中 result.put(error.getField(), error.getDefaultMessage()); }); log.info("========参数校验异常========="); return result; }
常用验证注解
常用的注解主要有以下几个,作用及内容如下所示
@Null,标注的属性值必须为空
@NotNull,标注的属性值不能为空
@AssertTrue,标注的属性值必须为true
@AssertFalse,标注的属性值必须为false
@Min,标注的属性值不能小于min中指定的值
@Max,标注的属性值不能大于max中指定的值
@DecimalMin,小数值,同上
@DecimalMax,小数值,同上
@Negative,负数
@NegativeOrZero,0或者负数
@Positive,整数
@PositiveOrZero,0或者整数
@Size,指定字符串长度,注意是长度,有两个值,min以及max,用于指定最小以及最大长度
@Digits,内容必须是数字
@Past,时间必须是过去的时间
@PastOrPresent,过去或者现在的时间
@Future,将来的时间
@FutureOrPresent,将来或者现在的时间
@Pattern,用于指定一个正则表达式
@NotEmpty,字符串内容非空
@NotBlank,字符串内容非空且长度大于0
@Email,邮箱
@Range,用于指定数字,注意是数字的范围,有两个值,min以及max