加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Validation 参数校验

发布时间:2020-12-14 06:36:35 所属栏目:Java 来源:网络整理
导读:这里是修真院后端小课堂,每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 八个方面深度解析后端知识/技能,本篇分享的是: 【 Validation 参数校验 】 【修真院java 小课堂】? Validation

这里是修真院后端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析后端知识/技能,本篇分享的是:

Validation 参数校验

【修真院java 小课堂】?Validation 参数校验

大家好,我是IT修真院郑州分院第12期的学员张泉良,一枚正直纯洁善良的JAVA程序员,今天给大家分享一下,

修真院官网JAVA任务二,深度思考中的知识点——Validation 参数校验

1. 背景介绍:

? ? 参数验证是一个常见的问题,无论是前端还是后台,都需对用户输入进行验证,以此来保证系统数据的正确性。

? ? 对于web来说,有些人可能理所当然的想在前端验证就行了,但这样是非常错误的做法,前端代码对于用户来说是透明的,

? ? 稍微有点技术的人就可以绕过这个验证,直接提交数据到后台。参数验证随处可见,也是必不可少的。

? ? 前端做验证只是为了用户体验,后端才是最终的保障。

2. 知识剖析:

? ?

???(1) 常见的参数检验方式:

? ? a、表现层验证:SpringMVC提供对JSR-303的表现层验证,或者直接将拿到的参数在controller层里面用if判断

? ? b、业务逻辑层验证:Spring3.1提供对业务逻辑层的方法验证

? ? c、DAO层验证:Hibernate提供DAO层的模型数据的验证

? ? d、数据库端的验证:通过数据库约束来进行?

? ? 原理都是基于javax validation,有特殊需求的话,可以自定义校验

? ?(2) JSR 303

? ? JSR 303(Java Specification Requests 规范提案)是JAVA EE 6中的一项子规范,

? ? 一套JavaBean参数校验的标准,叫做Bean Validation。

? ? JSR 303用于对Java Bean中的字段的值进行验证,Spring MVC 3.x之后之中也大力支持 JSR303

? ? JSR303提供的校验注解---------可以注解在javabean的field和properties上,也可以注解在map、list上,注解很灵活

? ? @Null 被注释的元素必须为 null

? ? @NotNull 被注释的元素必须不为 null

? ? @AssertTrue 被注释的元素必须为 true

? ? @AssertFalse 被注释的元素必须为 false?

? ? @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值?

? ? @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值

? ? @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值

? ? @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值

? ? @Size(max=,min=) 被注释的元素的大小必须在指定的范围内

? ? @Digits (integer,fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内

? ? @Past 被注释的元素必须是一个过去的日期?

? ? @Future 被注释的元素必须是一个将来的日期

? ? @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式

? ??

? ? (3) Hibernate Validator

? ? Hibernate Validator是JSR-303的一个参考实现,它除了支持所有标准的校验注解外,还支持如下扩展注解

? ? @Email 被注解的元素必须是电子邮箱地址

? ? @Length(min=,max=) 被注解的字符串的大小必须在指定的范围内

? ? @NotBlank 验证字符串非null,且长度必须大于0

? ? @NotEmpty 被注释的字符串的必须非空?

? ? @Range(min=,max=)? 被注解的元素必须在合适的范围内

? ? (4) Spring校验框架

? ? Spring的org.springframework.validation是校验框架所在的包。LocalValidatorFactoryBean既实现了

? ? Spring的Validator接口,又实现了JSR-303的Validator接口。只要在Spring容器中定义一个LocalValidatorFactoryBean

? ? 即可将其注入需要数据校验的Bean中。

3. 常见问题:

? ? (1) SpringValidation和javax validation的区别

? ? JSR303是一项标准,他们规定一些校验规范即校验注解,位于javax.validation.constraints包下,.只提供规范不提供实现

? ? Hibernate validation,他提供了相应的实现,并增加了一些其他校验注解

? ? spring validation其在springmvc模块中添加了自动校验,并将校验信息封装进了特定的类中

? ? (2) 参数校验的基本使用

? ? 多个属性的校验

? ? 在日志或者控制台输出校验的信息

? ? 部分注解仅能用于部分数据类型

? ? 如@notblank注解仅用于字符串,使用时需注意

? ??(3) 自定义消息错误消息

? ? Spring中定义了一个MessageSource接口,以用于支持信息的国际化和包含参数的信息的替换。

? ? ApplicationContext接口继承了MessageSource接口,

? ? 所以所有的ApplicationContext实现类都实现了MessageSource接口。

? ? 也就是我们我们可以通过ApplicationContext来调用MessageSource接口方法以实现信息的国际化和替换信息中包含的参? ? ? 数。

? ??

? ?

? ?

? ?

? ?

? ?

? ?

4. 编码实战:

5. 拓展思考:

? ? (1)分组校验

? ? 分组简单说: 解决实体中每个属性都是设置了参数检验,但是在某个方法内只想检验部分属性任务,也可以叫分类,

? ? 采用接口的方式来标识,可以类比java集合中的序列化接口 (Serializable)

? ? ?比如说有 用户名,密码,手机号,邮箱,年龄,性别,我想要检验其中的任意2个属性(假设为手机号,年龄),

? ? ? 当然可以直接加入对应的注解,如果换成手机号和密码,肯定又要写2个注解,

? ? ?当字段过多,并且使用场景频繁时,分组是个不错的选择

? ? ?假设有2个分组 interface Group1,interface Group2?

? ? ?@NotNull(message = "姓名不能为空",groups = {Group1.class})

? ? ?private String name;

? ? ?指定分组后,使用@Validated(Group1.class) Student student,只检验指定分组

? ? (2)自定义校验

??

? ? ? ? ?这个不建议进行,现有的检验类型基本够,如果有更多要求,建议使用逻辑判断,这样更清晰,记录日志方便,出现问题可以及时排查。

6. 参考文献:

7.? 更多讨论:

Q1:表单提交时,不填该表的内容,正常submit,默认为空字符串 "",怎么解决

A1:在前端验证是否为空,后端使用isEmpty方法或者@NotEmpty注解

Q2: 为什么会出现 HV000030: No validator could be found for type: java.lang.Integer.

A2: 可能在Integer属性上加了不属于整型的校验,比如@NotEmpty,@Length等

Q3:数值性参数: 当输入为空时,字符串"",解析失败之后不能再进行其他判断,会出现NPE

A3:可以考虑使用自定义异常,使用Spring Aop功能拦截异常,给出自定义的错误信息

8.? 鸣谢:

9.? 结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

PPT链接?视频链接

更多内容,可以加入IT交流群565734203与大家一起讨论交流

这里是技能树·IT修真院:,初学者转行到互联网的聚集地

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读