1. 整合
1.1 依赖引入
<dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId></dependency>
1.2 控制层
/*** 新增胎架计划** @param subsectionPlanVo* @return*/@PostMapping("/schedule")@ApiOperation("新增胎架计划")public R saveSchedule(@Valid @RequestBody SubsectionPlanVo subsectionPlanVo) {subsectionPlanService.saveSubsectionPlan(subsectionPlanVo);return R.ok();}
1.3 Vo数据类结构
package com.gkdz.server.modules.shelves.vo;import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;/*** 胎架计划*/
@Data
public class SubsectionPlanVo {@NotBlank(message = "分段id不能为空")private String shipSegmentId;//状态@NotNull(message = "变更状态不能为空")private Integer states;@NotNull(message = "坐标x不能为空")private double x;@NotNull(message = "坐标y不能为空")private double y;
}
1.4 数据异常处理
package com.imooc.exceptions;import com.imooc.grace.result.GraceJSONResult;
import com.imooc.grace.result.ResponseStatusEnum;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.UnsupportedJwtException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;import java.security.SignatureException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 全局异常处理,本质为切面** 注解ExceptionHandler为切入点*/
@ControllerAdvice
public class GraceExceptionHandler {/*** 全局BO数据校验异常处理* @param e* @return*/@ExceptionHandler(MethodArgumentNotValidException.class)@ResponseBodypublic GraceJSONResult returnNotValidException(MethodArgumentNotValidException e) {BindingResult result = e.getBindingResult();Map<String, String> errors = getErrors(result);return GraceJSONResult.errorMap(errors);}public Map<String, String> getErrors(BindingResult result) {Map<String, String> map = new HashMap<>();List<FieldError> errorList = result.getFieldErrors();for (FieldError fe : errorList) {// 错误所对应的属性字段名String field = fe.getField();// 错误信息String message = fe.getDefaultMessage();map.put(field, message);}return map;}}
1.5 测试效果
2. 其他
2.1 常用的校验注解
注解 | 含义 |
---|---|
@Null | 元素必须为null |
@NotNull | 元素不能null |
@AssertTrue | 元素必须为true |
@AssertFalse | 元素必须是false |
@Min(value) | 元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max,min) | 元素的大小必须在指定的范围内 |
@Digits(integer,fraction) | 元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 元素必须是一个过去的日期 |
@Future | 元素必须是一个将来的日期 |
@Pattern(value) | 元素必须符合指定的正则表达式 |
元素必须是电子邮箱地址 | |
@Length | 字符串的大小必须在指定的范围内 |
@NotEmpty | 字符串必须非空 |
@Range | 元素必须在合理的范围内 |
2.2 @NoNull、@NotEmpty、@NotBlank
1.三者的区别
@NotNull
适用于基本数据类型(Integer,Long,Double等等),当 @NotNull 注解被使用在 String 类型的数据上,则表示该数据不能为 Null(但是可以为 Empty)
注:被其标注的字段可以使用 @size、@Max、@Min 对字段数值进行大小的控制
@NotEmpty:
不能为null,而且长度必须大于0,一般用在集合类上面,适用于 String、Collection集合、Map、数组等等,加了@NotEmpty 注解的参数不能为 Null 或者 长度为 0
@NotBlank:
不能为null,注意是只能用在String上,而且调用trim()后,长度必须大于0
2.3 @Valid 和 @Validated 比较
最后我们来对 @Valid 和 @Validated 两个注解进行总结下:
1:@Valid 和 @Validated 两者都可以对数据进行校验,待校验字段上打的规则注解(@NotNull, @NotEmpty等)都可以对 @Valid 和 @Validated 生效;
2:@Valid 进行校验的时候,需要用 BindingResult 来做一个校验结果接收。当校验不通过的时候,如果手动不 return ,则并不会阻止程序的执行;
3:@Validated 进行校验的时候,当校验不通过的时候,程序会抛出400异常,阻止方法中的代码执行,这时需要再写一个全局校验异常捕获处理类,然后返回校验提示。
4:总体来说,@Validated 使用起来要比 @Valid 方便一些,它可以帮我们节省一定的代码,并且使得方法看上去更加的简洁。
2.4 失效问题
单个对象无效
必须在controller中加上@Valid 或者@Validated,其中@Validated要和@NotEmpty组合使用
import org.springframework.validation.annotation.Validated;@PostMapping("/schedule")@ApiOperation("新增胎架计划")public R saveSchedule(@Valid @RequestBody SubsectionPlanVo subsectionPlanVo) {subsectionPlanService.saveSubsectionPlan(subsectionPlanVo);return R.ok();}
嵌套对象失效
需要在外层对象的属性上加@Valid
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotBlank;@Data
public class TestParam {@NotBlankprivate String className;@Validatedprivate List<UserDTO> users;
}
import javax.validation.constraints.NotBlank;@Data
public class UserDTO {@NotBlankprivate String name;}