SpringBoot 轻松搞定数据验证 (二)
感谢作者: http://www.spring4all.com/article/1225
当系统自带的注解无法满足我们的要求时候应该咋办呢?这就是本章将给各位介绍的自定义 Validator 注解
为何要自定义
javax.validation
包与 hibernate-validator
包中存在的注解几乎可以满足大部分的要求,又拥有基于正则表达式的@Pattern
,为什么还需要自己去定义呢?
- 正则效率不高
- 正则可读性不好
- 正则门槛较高,很多开发者并不会编写正则表达式
本章目标
熟悉 ConstraintValidator
接口并且编写自己的数据验证注解
自定义注解
这里定义了一个 @DateTime
注解,在该注解上标注了 @Constraint
注解,它的作用就是指定一个具体的校验器类
/*** @author Ray* @date 2018/7/4 0004* 自定义注解* FIELD 约束相关的属性;PARAMETER 约束相关的参数*/
@Target({ElementType.FIELD, ElementType.PARAMETER}) // 约束注解应用的目标元素类型
@Retention(RetentionPolicy.RUNTIME) // 约束注解应用的时机
@Constraint(validatedBy = DateTimeValidator.class) // 与约束注解关联的验证器
public @interface DateTime {/*** 约束注解验证时的输出消息 - 关键字段*/String message() default "格式错误";/*** 约束注解验证时的格式*/String format() default "yyyy-MM-dd";/*** 约束注解在验证时所属的组别 - 关键字段*/Class<?>[] groups() default {};/*** 约束注解的有效负载 - 关键字段*/Class<? extends Payload>[] payload() default {};
}
具体验证
定义校验器类 DateTimeValidator
实现 ConstraintValidator
接口,实现接口后需要实现它里面的 initialize
与 isValid
方法。
/*** @author Ray* @date 2018/7/4 0004* 日期格式验证* 实现 initialize 与 isValid 方法*/
public class DateTimeValidator implements ConstraintValidator<DateTime, String> {private DateTime dateTime;/*** 主要用于初始化,它可以获得当前注解的所有属性*/@Overridepublic void initialize(DateTime dateTime) {this.dateTime = dateTime;}/*** 进行约束验证的主体方法,* 其中 value 就是验证参数的具体实例,* context 代表约束执行的上下文环境*/@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {// 如果 value 为空则不进行格式验证,为空验证可以使用 @NotBlank @NotNull @NotEmpty 等注解来进行控制,职责分离if(value == null){return true;}String format = dateTime.format();if(value.length() != format.length()){return false;}SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);try{simpleDateFormat.parse(value);}catch (ParseException e){return false;}return true;}
}
控制层
/*** @author Ray* @date 2018/7/4 0004* 参数校验*/
@Validated
@RestController
public class ValidateController2 {@GetMapping("/test")public String test(@DateTime(message = "您输入的格式错误,正确的格式为:{format}", format = "yyyy-MM-dd") String date){return "success";}
}
测试
完成准备事项后,启动项目,自行测试即可,测试手段相信大伙都不陌生了,如 浏览器
、postman
、junit
、swagger
,此处基于 postman
>错误格式
>正确格式
SpringBoot 轻松搞定数据验证 (二)相关推荐
- SpringBoot 轻松搞定数据验证 (三)
感谢作者: http://www.spring4all.com/article/1228 本章也是轻松搞定数据验证的最后一篇, 一起来揭开神秘的分组验证 分组验证 有的时候,我们对一个实体类需要有多中 ...
- SpringBoot 轻松搞定数据验证 (一)
感谢作者: http://www.spring4all.com/article/1224 对于任何一个应用而言,客户端做的数据有效性验证都不是安全有效的,而数据验证又是一个企业级项目架构上最为基础的功 ...
- 9月20日云栖精选夜读 | 如何轻松搞定数据科学面试:Python&R语言篇
对于数据科学家来说,工作的一大部分都需要在交互式编程环境中对数据进行处理.分析和可视化. 在过去几年,R语言和Python成了进行数据科学中最炙手可热的两种语言.这两种语言各有优缺点,掌握这两种语言大 ...
- pythonr语言三种基本结构_如何轻松搞定数据科学面试:Python&R语言篇
作者: Carson Forter 编译: Mika本文为 CDA 数据分析师原创作品,转载需授权 对于数据科学家来说,工作的一大部分都需要在交互式编程环境中对数据进行处理.分析和可视化. 在过去几年 ...
- 动态添加跨行表格_学会这2招,轻松搞定数据透视表动态更新,效率猛增一倍...
私信回复关键词[福利],获取丰富办公资源,助你高效办公早下班! Hello,大家好,我是最近在研究数据透视表的小爽~ 最近,我收到了一个学员的求助: 简单归纳一下,这个问题就是: 如何能让数据透视表的 ...
- mybatis-plus团队新作:mybatis-mate 轻松搞定数据权限
欢迎关注方志朋的博客,回复"666"获面试宝典 今天介绍一个 MyBatis - Plus 官方发布的神器:mybatis-mate 为 mp 企业级模块,支持分库分表,数据审计. ...
- 轻松搞定RabbitMQ(二)——工作队列之消息分发机制
上一篇博文中简单介绍了一下RabbitMQ的基础知识,并写了一个经典语言入门程序--HelloWorld.本篇博文中我们将会创建一个工作队列用来在工作者(consumer)间分发耗时任务.同样是翻译的 ...
- 线程导入大数据入库_大数据处理及分析该怎么做?用这款数据分析软件轻松搞定...
对大数据的重视让很多企业都在纷纷寻找更好的大数据处理及分析方法?这款数据分析软件轻松搞定! 一.数据采集 虽然每天互联网都会产生大量的数据,对于企业来讲,要搜集对自己企业有用的数据才是真的大数据.首 ...
- 如何在原先的jqgrid中填充新的数据_自然人电子税务局(扣缴端)数据如何恢复?申税小微教您轻松搞定...
自然人电子税务局 数据如何恢复? 申税小微教您轻松搞定! 财务小王:申税小微,我们公司换了新电脑,重新安装的自然人电子税务局(扣缴端)上没有人员采集信息和历史申报数据该怎么办? 申税小微: 1.可以在 ...
最新文章
- oracle 11g wm_concat 、 listagg 函数的使用(合并数据)
- NginxApachePHP参数汇总
- ASP.NET中gridview获取当前行的索引值
- boost::python::dict相关的测试程序
- [python opencv 计算机视觉零基础到实战] 十一找到图片中指定内容
- 简单的html5级联下拉菜单,什么是html5纯CSS的三级联动级联菜单
- PHP 数组排序函数sort,rsort,ksort,krsort,asort,arsort区别
- 设计模式(6)——抽象工厂模式(Abstract Factory Pattern,创建型)
- python基础编程语法-Python基础语法介绍:面向对象编程(上)
- 分解例题_2020年中考数学考点之利用平方差公式进行因式分解习题练习
- List之LinkedList与ArrayList区别
- WIFI adb重启后仍然生效
- 机械硬盘显示无法访问由于IO设备错误的资料找回方法
- NexT 主题自定义侧边栏图标
- 还在职,入职A签订了竞业限制,如何解除?
- 如何判断网站被黑?网站被黑如何应对?如何防止网站被黑?
- 2020年TI杯大学生电子设计大赛 无线运动传感器节点 备赛、参赛实录(历时一个月)
- JS获取json子项/数组的个数/长度
- 苹果cms模板_苹果cms爱看模板有哪些?
- 基于单片机的居家安全报警系统