上一篇文章我们了解了spring boot web相关的知识,初步了解了spring-boot-starter-web,还了解了@contrler和@restcontroller的差别,如果使用@controller注解只返回数据则需要使用@responsebody注解。与此同时还了解了@requestmapping注解与url映射,url映射可以分为url路径匹配、method匹配、consumes和produces匹配、params和header匹配。这篇文章我们将会介绍数据校验,对于任何应用系统而言,任何客户端传入的数据都不是绝对安全有效的,这就要求我们在服务端接收到数据时需要对传入的数据的有效性进行验证,以确保传入的数据安全正确。
hibernate validator简介目前数据校验的规范和组件有很多,spring boot默认使用的数据校验组件是基于jsr数据校验规范的hibernate validator,其中常用的注解如下表所示
注解作用目标检查规则
@notnull 属性 检查值是否为空
@null 属性 检查值必须为空
@asserfalse 属性 检查演算结果是否为false
@asserttrue 属性 检查演算结果是否为true
@max(value=) 属性(以numeric或string类型表示一个数字) 检查值是否小于或等于最大值
@min(value=) 属性(以numeric或string类型表示一个数字) 检查值是否大于或等于最小值
@size(min=, max=) 属性(array,collection,map) 检查元素大小是否在最大值和最小值之间(包括临界值)
@digits(integer,fraction) 属性 检查元素必须是数字且在范围内
@past 属性(data或calender) 检查日期是否是过去的日期
@feature 属性data或calender) 检查日期是否是未来的日期
@pattern(regex=rexgex,flag=) 属性 检查值是否与正则表达式匹配
@range(min=,max=) 属性(以numeric或string类型表示一个数字) 检查元素大小是否在最大值和最小值之间(包括临界值)
@length(min=,max=) 属性(string) 检查字符串长度是否符合范围
@email 属性(string) 检查是否是有效的email地址
@notempty 属性(string) 检查字符串不能为空
使用hibernate validator校验数据需要定义一个接受的数据模型,使用注解的形式描述字段的校验规则,下面以user对象为例说明如何校验数据,先加入以下依赖:
org.springframework.boot spring-boot-starter-validationjavabean参数校验post请求参数较多时可以在对应的数据模型(java bean)中进行校验,通过注解来指定字段校验的规则。
public class user { @notblank(message = 姓名不允许为空) @length(min = 2, max = 10, message = 姓名长度错误,姓名长度2-10) private string name; @notnull(message = 年龄不能为空!) @min(18) private int age; @notblank(message = 地址不能为空!) private string address; @email(message = 邮箱格式错误) private string email; //省略get和set方法}上述例子中,每个message是数据校验不通过时要给出的提示信息。然后需要添加数据校验方法。
@postmapping(path = /check)public string check(@requestbody @valid user user, bindingresult result) { string name = user.getname(); if (result.haserrors()) { list上面例子中bindingresult是验证不通过的结果集合,必须跟在被校验参数后,若被校验参数之后没有bindingresult则会抛出bindexception异常。
javabean对象的级联校验在对象的普通属性上我们可以直接使用注解进行数据校验,对于关联对象也很容易,在关联对象上添加@valid注解,关联对象内部可以正常使用数据校验注解。代码如下:
public class user { @notblank(message = 姓名不允许为空) @length(min = 2, max = 10, message = 姓名长度错误,姓名长度2-10) private string name; @notnull(message = 年龄不能为空!) @min(18) private int age; @notblank(message = 地址不能为空!) private string address; @email(message = 邮箱格式错误) private string email; @notnull(message = detail不能为空) @valid private userdetail detail; //省略get和set方法}public class userdetail { @notnull(message = id不能为空) private string id; public string getid() { return id; } public void setid(string id) { this.id = id; }}分组校验在不同的情况下,可能对相同javabean对象的数据校验规则有所不同,有时需要根据状态数据对javabean中的某些属性字段进行单独验证。这时候就可以使用分组校验功能,即根据状态启用一组约束,hibernate validator的注解提供了groups参数用于指定分组,如果没有指定groups参数,则默认属于javax.validation.groups.default。接下来我们举例来说明这一过程。
首先创建分组groupa和groupb如下,这两个接口作为两个校验规则的分组。
public interface groupa {}public interface groupb {}然后创建实体类person,并在相关字段定义分组校验规则。
public class person { @notblank(message = userid不能为空, groups = {groupa.class}) private string userid; @notblank(message = 用户名不能为空, groups = {groupb.class}) private string name; @range(min=20, max = 30, message = 年龄必须在【20,30】, groups = {groupa.class}) @range(min = 30, max = 40, message = 年龄必须在【30,40】, groups = {groupb.class}) private int age; //省略来get方法和set方法}上述例子中,在age字段使用了两个校验规则,groupa年龄要在20-30,groupb年龄要在30-40。最后使用分组:
@requestmapping(/save)public string save(@requestbody @validated({ groupa.class, default.class}) person person, bindingresult result) { if (result.haserrors()) { list其中@validated注解中增加了{groupa.class, default.class}参数表示对于定义了分组校验规则的字段使用groupa规则,其他使用默认规则。
【智能工厂】环境监测安全预警系统解决方案
FPGA AXI4协议学习笔记(一)
劳斯莱斯电动飞机亮相,明年首飞欲打破纪录速度
变压器是由什么组成
三星Galaxy A20s开启预售搭载骁龙450平台最大支持512GB存储卡扩展
简述Spring Boot数据校验
运营商携号转网或将改变竞争格局,与5G发展如何进行取舍
物联网PAAS平台服务的十大趋势说明
虹科技术 | 终端入侵防御 | 在重大攻击中发现新的Babuk勒索软件
什么是元组
Equipmake将推出超过20 kW/kg功率密度的电机
云天励飞亮相全球(深圳)人工智能生态峰会
投影机专业术语大全
电源纹波对芯片工作的影响
技术为王!普渡科技获评2022年度深圳市知识产权优势单位
国产机器人突破的关键:减速器
Type-C分线器双重工艺产品耐用
CAD快速绘图的几种基本方法
延时关灯器电路原理
javascript中输出到控制台的代码