Java Validation校验
前言
在日常的开发中,经常需要对参数进行校验,如果采用代码硬编码去校验,不但代码可扩展性差、复用率低,并且新增字段时可能会漏掉校验,维护成本比较高。简述JSR303/JSR-349,hibernate validation,spring validation之间的关系。
- JSR303是一项标准,JSR-349是其的升级版本,添加了一些新特性,他们规定一些校验规范即校验注解,如@Null,@NotNull,@Pattern,他们位于javax.validation.constraints包下,只提供规范不提供实现。
- hibernate validation是对这个规范的实践(不要将hibernate和数据库orm框架联系在一起),他提供了相应的实现,并增加了一些其他校验注解,如@Email,@Length,@Range等等,他们位于org.hibernate.validator.constraints包下。
- spring validation 给开发者提供便捷,对hibernate validation进行了二次封装,显示校验validated bean时,你可以使用spring validation或者hibernate validation,而spring validation另一个特性,便是其在springmvc模块中添加了自动校验,并将校验信息封装进了特定的类中。这无疑便捷了我们的web开发。
注意:通常情况下hibernate validation 和 Spring validation结合使用
@validated和@valid使用说明
@validated和@valid区别
在检验 Controller 的入参是否符合规范时,使用 @Validated 或者 @Valid 在基本验证功能上没有太多区别。但是在分组、注解地方、嵌套验证等功能上两个有所不同:
- 分组。@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制,这个网上也有资料,不详述。@Valid:作为标准JSR-303规范,还没有吸收分组的功能。
- 注解地方。@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上。@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上。两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能。
- 嵌套验证。@Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上,来配合方法参数上@Validated或@Valid来进行嵌套验证。
@validated的使用注意点
- @validated和@valid都可以用在controller层的参数前面,但这只能在controller层生效。
- @validated如果要开启方法验证。注解应该打在类上,而不是方法参数上。
- 方法验证模式下,被jsr303标准的注解修饰的可以是方法参数也可以是返回值,类似如下 public @NotNull Object myValidMethod(@NotNull String arg1, @Max(10) int arg2)
- @validated不支持嵌套验证。所以jsr303标准的注解修饰的对象只能基本类型和包装类型。其他类型只能做到检测是否为空,对于对象里面的jsr303标准的注解修饰的属性,不支持验证。
依赖引入
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.1.1.Final</version> </dependency>
参考文章
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
arthas 阿尔萨斯 Java诊断工具
下载和安装 curl -O https://alibaba.github.io/arthas/arthas-boot.jar java -jar arthas-boot.jar 使用as.sh curl -L https://alibaba.github.io/arthas/install.sh | sh 直接在shell下面执行./as.sh,就会进入交互界面。也可以执行./as.sh -h来获取更多参数信息。 常用的命令 基本命令 help——查看命令帮助信息 cat——打印文件内容,和linux里的cat命令类似 pwd——返回当前的工作目录,和linux命令类似 cls——清空当前屏幕区域 session——查看当前会话的信息 reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类 version——输出当前目标 Java 进程所加载的 Arthas 版本号 history——打印命令历史 quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响 shutdown——关闭 Arthas 服务端,所有...
- 下一篇
【Java并发基础】使用“等待—通知”机制优化死锁中占用且等待解决方案
【Java并发基础】使用“等待—通知”机制优化死锁中占用且等待解决方案 阅读目录前言就医流程—完整的“等待—通知”机制Java中“等待—通知”机制的实现如何使线程等待,wait()如何唤醒线程,notify()/notifyAll()使用“等待-通知”机制重写转账一些需要注意的问题sleep()和wait()的区别为什么wait()、notify()、notifyAll()是定义在Object中,而不是Thread中?小结 回到目录前言在前篇介绍死锁的文章中,我们破坏等待占用且等待条件时,用了一个死循环来获取两个账本对象。 java// 一次性申请转出账户和转入账户,直到成功while(!actr.apply(this, target));我们提到过,如果apply()操作耗时非常短,且并发冲突量也不大,这种方案还是可以。否则的话,就可能要循环上万次才可以获取锁,这样的话就太消耗CPU了! 于是我们给出另一个更好的解决方案,等待-通知机制:若是线程要求的条件不满足,则线程阻塞自己,进入等待状态;当线程要求的条件满足时,通知等待的线程重新执行。 Java是支持这种等待-通知机制的,下面我...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主