SpringBoot@Validated注解实现参数分组校验的⽅法实例
前⾔
在前后端分离开发的时候我们需要⽤到参数校验,前端需要进⾏参数校验,后端接⼝同样的也需要,以防传⼊不合法的数据。
1、⾸先还是先导包,导⼊pom⽂件。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2、解释⼀下注解的作⽤
@Null 限制只能为null
@NotNull 限制必须不为null
@NotEmpty 只作⽤于字符串类型,字符串不为空,并且长度不为0
@NotBlank 只作⽤于字符串类型,字符串不为空,并且trim()后不为空串
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为⼀个不⼤于指定值的数字
@DecimalMin(value) 限制必须为⼀个不⼩于指定值的数字
@Digits(integer,fraction) 限制必须为⼀个⼩数,且整数部分的位数不能超过integer,⼩数部分的位
数不能超过fraction
@Future 限制必须是⼀个将来的⽇期
@Past 验证注解的元素值(⽇期类型)⽐当前时间早
@Max(value) 限制必须为⼀个不⼤于指定值的数字
@Min(value) 限制必须为⼀个不⼩于指定值的数字
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定⾃定义的email格式
3、在实体类加上要验证的字段。(我这⾥随便写下)
标注的地⽅就是⽤来分组校验的,下下⾯会解释。
@Data
public class LoginVo {
@ApiModelProperty(value = "⽤户名称")
@NotEmpty(message = "⽤户名不能为空!",groups = LoginModel.class)
@NotEmpty(message = "添加时⽤户名不能为空!",groups = SaveModel.class)
private String userName;
@ApiModelProperty(value = "密码")
@Size(min = 2,message = "密码最少为2位",groups = LoginModel.class)
@Size(min = 6,message = "密码最少为6位",groups = SaveModel.class)
private String password;
}
通过groups的属性来分组,假设我在使⽤登录分组校验的时候,设定⽤户名不能为空和密码最少为2位的验证。⽽在添加分组设定添加时⽤户名不能为空和密码最少为6位的验证。
4、在来解释下上⾯标注的分组接⼝。
LoginModel
import ups.Default;
public interface LoginModel extends Default {
}
必须继承默认的Defaut接⼝不然后抛出异常。
SaveModel
import ups.Default;
public interface SaveModel extends Default{
}
正则匹配注解5、在controller的接⼝上加上@Validated注解,参数就加上你需要根据那种规则来校验。
@ApiOperation(value = "登录以后返回token")
@PostMapping(value = "/login")
public Result login(@RequestBody @Validated(LoginModel.class) LoginVo loginVo) {
String token = userService.UserName(), Password());
return Result.success(token);
}
运⾏后只能在控制台显⽰错误的结果,新的问题⼜来了怎么把错误的结果通过⾃⼰的result类返回给前端。这就需要对错误全局捕捉了。
6、写⼀个对Response换回结果的处理。
@RestControllerAdvice
@Slf4j
public class ParameterCalibration {
@ExceptionHandler({MethodArgumentNotValidException.class, BindException.class})
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Result handleMethodArgumentNotValidException(Exception exception) {
StringBuilder errorInfo = new StringBuilder();
BindingResult bindingResult=null;
if(exception instanceof MethodArgumentNotValidException){
bindingResult= ((MethodArgumentNotValidException)exception).getBindingResult();
}
if(exception instanceof BindException){
bindingResult= ((BindException)exception).getBindingResult();
}
for(int i = 0; i < FieldErrors().size(); i++){
if(i > 0){
errorInfo.append(",");
}
FieldError fieldError = FieldErrors().get(i);
errorInfo.Field()).append(" :").DefaultMessage());
}
<(String());
/
/这⾥返回⾃⼰的Result的结果类。
return Result.String());
}
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public Result handleDefaultException(Exception exception) {
<(String());
//这⾥返回⾃⼰的Result的结果类。
return Result.validateFailed("服务器错误",exception);
}
}
``
7. 先测试LoginModel的校验规则
控制台打印的数据
前端收到的数据
切换成SaveModel控制台打印的数据
切换成SaveModel前端收到的数据
可以看到两次的验证规则时不同的,完成了简易的分组操作。
8 、总结,就是在添加验证规则的时候指定对应的分组,在使⽤时传⼊需要的分组。可能理解有误,发现请指导。
总结
到此这篇关于SpringBoot @Validated注解实现参数分组校验的⽂章就介绍到这了,更多相关SpringBoot @Validated注解实现参数分组校验内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论