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)
@ResponseBody
public 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 {
@NotBlank
private String className;
@Validated
private List<UserDTO> users;
}
import javax.validation.constraints.NotBlank;
@Data
public class UserDTO {
@NotBlank
private String name;
}