网站首页 > java教程 正文
各位朋友大家好,我是奋斗的小强001,本期更新的内容是:Validated校验在springboot框架中的应用。
前言
b/s系统中对http请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上考虑,但是在一些安全性要求高的系统中服务端校验是不可缺少的。
Spring3支持JSR-303验证框架,JSR-303 是Java EE 6中的一项子规范,叫做BeanValidation,官方参考实现是hibernate Validator(与Hibernate ORM没有关系),JSR 303 用于对Java Bean 对字段的值进行验证。
spring-boot中在Controller层里面可以用@validated注解来校验数据再进入业务逻辑层,如果数据异常则会统一抛出异常,方便异常中心统一处理。
比如,我们判断一个输入的用户名长度限制以及密码的正则验证.
使用教程
1.添加依赖
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.16.Final</version>
</dependency>
2.Controller层数据使用@validated注解(表示开启,需要根据自己的业务在对应的方法参数上添加)
@PostMapping("/userLogin")
@ResponseBody
public TResult login(@RequestBody(required=true) @Validated User user) {
return accountServiceInter.login(user);
}
}
3.然后在实体上声明需要被校验的字段(需要根据自己的业务添加,具体注解在6)
@Pattern(regexp = "^[a-zA-Z0-9_]{4,16}#34;, message = "用户名必需4-16位")
private String username;
//用户密码
@Pattern(regexp ="^[a-zA-Z0-9_]{6,16}#34;, message = "用户名必需6-16位")
private String password;
4.全局异常捕获
4.1网上业务处理
/**
* 处理所有接口数据验证异常
* @param e
* @return
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public TResult handleValidException(MethodArgumentNotValidException e) {
logger.error("程序验证错误",e);
TResult tResult = TResultEncap.setErrResult(ReturnCodeBase.ERR6000);
tResult.setErrMsg(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
return tResult;
}
4.2系统业务处理
/**
* Validated注解校验异常
* mdw
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public Object methodArgumentNotValidException(HttpServletRequest request, MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
if (StringUtils.isNotEmpty(bindingResult.getAllErrors())) {
String defaultMessage = bindingResult.getAllErrors().get(0).getDefaultMessage();
return ApiResult.fail(defaultMessage);
}
return ApiResult.fail("服务器错误,请联系管理员");
}
当输入不能满足条件时,就会抛出异常,而后统一由异常中心处理,推荐方式2
5.嵌套校验(特殊情况内嵌套的,关联查询的,需要如下操作)
如果一个类中包含了另外一个实体类,那么在上面加上@Validated即可,比如下面的
public class Student{
@validated
private List< User>studentList;
}
6.常用注解类型(文字版,根据业务需要添加,多注解添加同时生效)
限制 说明
@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 限制必须是一个过去的日期
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@Past 验证注解的元素值(日期类型)比当前时间早
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
优缺点
优点: 统一接口校验方法,并且可以指定相应的异常信息,避免手动写if else判断参数是否合法
缺点:在公用一个打开校验的接口时,校验有问题.需要在使用的时候考虑
注意事项
1、修改时如果不传此校验的参数会报错,所以修改时也应该传全参。
2、使用时需在接口参数前添加注解开启此校验。
3、使用注解时应抛出异常信息。默认的异常信息是英文。
4、建议大家使用的时候先结合大家的业务使用.
欢迎大家阅读和探讨.有问题可以随时私信我,谢谢大家. 欢迎大家的点赞和支持。
猜你喜欢
- 2024-10-19 java正则表达式入坑指南(java正则表达式用法)
- 2024-10-19 js正则表达式验证大全(js正则表达式用法)
- 2024-10-19 使用Annotation注解在实体类中进行参数校验
- 2024-10-19 vue正则验证汇总(手机号、密码、正整数、邮箱、身份证等)
- 2024-10-19 SpringBoot分组校验及自定义校验注解
- 2024-10-19 统一参数校验validator 从使用到走向自定义参数校验
- 2024-10-19 SpringValidation用注解代替代码参数校验解析
- 2024-10-19 使用正则表达式验证身份证号-C#学习进阶
- 2024-10-19 Python正则校验手机、电话号码有效性
- 2024-10-19 javascript 正则表达式校验密码格式
你 发表评论:
欢迎- 05-27JavaScript 中的运算符优先级
- 05-27Java程序员必备:运算符使用中的八大实战要点
- 05-27Java运算符优先级表
- 05-272025-04-29:高度互不相同的最大塔高和。用go语言,给定一个数组
- 05-27PHP排序算法:计数、选择、插入、归并、快速、冒泡、希尔、堆
- 05-27Python高级排序算法应用
- 05-27用好RANK函数 跨表排名不用愁
- 05-27十大排序算法时空复杂度
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)