一、验证要求
检查前端传输的数据合法性。
二、验证方法
1.1 定义
在业务成对request非空判断中的参数。
1.2 举例
Stu.java
@Data @EqualsAndHashCode(callSuper = false) public class Stu implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id",type = IdType.AUTO) private int id; private String name; private int age; private String gender; private String address; private Date birth; }
StuServiceImpl.java
@Service public class StuServiceImpl extends ServiceImpl<StuMapper, Stu> implements StuServiceI { @Override public Result add(Stu stu) { if(stu.getName()==null){ return Result.fail("学生名不能为空"); } if(stu.getAddress()==null){ return Result.fail("学生地址不能为空"); } this.save(stu); return Result.success(); } }
1.3 缺点
若实体类字段较多,不易维护,给业务层增加负担。
2.1 定义
声明校验,又称JSR303校验。
JRS303是Java为Bean数据合法性验证提供的标准框架,JSR303通过在Bean类似于属性上注@NotNull、@NotBlank实现数据合法性验证。
2.2 相关注解
注解 | 功能 |
---|---|
@Null | 验证对象是否为 null |
@NotNull | 验证对象是否不是 null |
@AssertTrue | 验证 Boolean 对象是否为 true |
@AssertTrue | 验证 Boolean 对象是否为 false |
@Max(value) | 验证 Number 和 String 对象是否小于指定值 |
@Min(value) | 验证 Number 和 String 对象是否大于指定值 |
@DecimalMax(value) | 验证注释的元素值小于或等于 @DecimalMax 指定的 value 值 |
@DecimalMin(value) | 验证注释的元素值大于或等于 @DecimalMin 指定的 value 值 |
@Digits(integer,fraction) | 验证字符串是否符合指定格式,integer 指定整数精度,fraction 指定小数精度 |
@Size(min,max) | 验证对象长度是否在给定范围内 |
@Past | 验证 Date 和 Calendar 对象是否在当前时间之前 |
@Future | 验证 Date 和 Calendar 对象是否在当前时间之后 |
@Pattern | 验证 String 对象是否符合正则表达式规则 |
@NotBlank | 检查字符串是不是 Null,被 Trim 是否长度大于0,只对字符串,前后空格会去除 |
@URL | 验证是否合法 url |
@CreditCardNumber | 验证信用卡号是否合法 |
2.3 Hibernate Validator 扩展注解
注解 | 功能 |
---|---|
验证邮箱是否合法 | |
@Length(min,max) | 验证字符串的长度必须在指定范围内 |
@NotEmpty | 检查元素是否为 Null 或 Empty |
@Range(min,max,message) | 必须在适当的范围内验证属性值 |
2.4 示例代码
2.4.1 pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
注意:validation 启动依赖里 包含jakarta:el:3.0.4.jar 和hibernate-validator:6.1.7.Final.jar
2.4.2 实体类Stu.java
@Data @EqualsAndHashCode(callSuper = false) public class Stu implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id",type = IdType.AUTO) private int id; @NotBlank(message = "名字不能为空") @Length(max = 20, message = "用户名的长度不得超过20") private String name; private int age; private String gender; @NotBlank(message = "性别不能为空") private String address; private Date birth; }
2.4.3 控制层StuController.java
使用@Valid注解。
如果要分组验证,可以使用@Validated这里不演示注释。
@RestController @RequestMapping("/stu") public class StuController { @Resource private StuServiceI stuService; @PostMapping public Result add(@Valid @RequestBody Stu stu){ stuService.save(stu);
return Result.success("新增成功");
}
}
2.4.4 全局异常处理ExceptionCatch.java
数据合法校验的异常是MethodArgumentNotValidException,多个数据合法校验异常,只提示用户第一个。
@RestControllerAdvice
public class ExceptionCatch {
private static ImmutableMap.Builder<Class<? extends Exception>,ExceptionResult> builder = ImmutableMap.builder();
/**
* 自定义异常处理
* @param e
* @return
*/
@ExceptionHandler(CustomException.class)
public ResponseResult handlerRuntimeException(CustomException e){
ExceptionResult result = e.getExceptionResult();
return ResponseResult.fail(result.retCode(),result.retMsg());
}
@ExceptionHandler(value= MethodArgumentNotValidException.class)
public ResponseResult validateException(MethodArgumentNotValidException e){
BindingResult bindingResult=e.getBindingResult();
Map<String,Object> map=new HashMap<>();
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
//bindingResult.getFieldErrors().forEach(exption->{
// map.put(exption.getField(),exption.getDefaultMessage());
//
//});
FieldError fieldError = fieldErrors.get(0);
map.put("field",fieldError.getField());
map.put("msg",fieldError.getDefaultMessage());
return ResponseResult.fail("数据校验异常",map);
}
/**
* 其他异常处理
* 除运行时异常以外的异常
* @param e
* @return
*/
@ExceptionHandler(Exception.class)
public ResponseResult handlerException(Exception e){
ExceptionResult result = builder.build().get(e.getClass());
if(ObjectUtil.isNotNull(result)){
return ResponseResult.fail(result.retCode(),result.retMsg());
}
return ResponseResult.fail(e.getMessage());
}
}
2.5 测试