对于参数的校验,一般使用Springboot、SpringMVC的同学,都会使用JSR303来进行参数的校验;这样会使得代码简介、规范,代码量减少、错误率减少的功效。
JSR303的官方文档:https://pan.baidu.com/s/1ju11mOKTimXhTRNF_zxGGA
提取码:qkbu
1、引入依赖,可以直接使用Springboot自带的starter,也可以是maven仓库是找依赖
Springboot自带的starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
hibernate 提供的JSR303依赖
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
2、在Controller 中,@valid 修饰的参数主体,进行JSR303注解标识校验类型,如:
@Data
@TableName("user")
public class UserEntity {
@TableId(type = IdType.AUTO)
private Long id;
private String username;
private String salt;
private String password;
@NotEmpty(message = "training.user.save.tel.notnull")
private String tel;
@NotNull(message = "training.user.save.type.notnull")
private String type;
private Byte del;
}
3、在Controller 层对校验的结果进行处理
①不做任何处理,如果校验不通过的时候,会将异常直接打到请求的api的返回结果上(不推荐)
②在Controller层,进行处理,使用 BindingResult ,进行返回参数处理(不推荐,代码累赘,重复代码繁多)
@PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public UserEntity save(@Valid @RequestBody UserEntity userEntity, BindingResult bindingResult){
for (FieldError fieldError : bindingResult.getFieldErrors()) {
String message =
messageSource.getMessage(Objects.requireNonNull(fieldError.getDefaultMessage()), null, Locale.getDefault());
System.out.println(message);
System.out.println(fieldError.getDefaultMessage());
}
return userEntity;
}
③统一异常处理,在统一异常处理上,对 MethodArgumentNotValidException 异常补抓,单独处理(强烈推荐),具体返回什么,还是i18n处理后返回,根据业务需求返回,例子只是单纯的返回。
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseDto methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e){
BindingResult bindingResult = e.getBindingResult();
String errMessage =
bindingResult.getFieldErrors().stream().map(fieldError -> fieldError.getDefaultMessage())
.collect(Collectors.joining(";"));
return ResponseDtoUtils.err(errMessage);
}
@ExceptionHandler(BindException.class)
public ResponseDto methodArgumentNotValidExceptionHandler(BindException e){
BindingResult bindingResult = e.getBindingResult();
String errMessage =
bindingResult.getFieldErrors().stream().map(fieldError -> fieldError.getDefaultMessage())
.collect(Collectors.joining(";"));
return ResponseDtoUtils.err(errMessage);
}
=============================《基础篇完》=================================
还有一个校验的高级篇,自定义校验注解