Validation参数校验

仰英发
2023-12-01

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

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

【Validation参数校验】

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

大家好,我是IT修真院北京分院第35期一枚正直纯洁善良的Java程序员,今天给大家分享一下,修真院官网Java(职业)任务二,深度思考中的知识点——Validation参数校验

  1. 背景介绍

数据的校验是交互式网站一个不可或缺的功能,前端的js校验可以涵盖大部分的校验职责,如用户名唯一性,生日格式,邮箱格式校验等等常用的校验。但是为了避免用户绕过浏览器,使用http工具直接向后端请求一些违法数据,服务端的数据校验也是必要的,可以防止脏数据落到数据库中.

JSR-303

JSR-303是Java为Bean数据合法性校验所提供的标准框架,它已经包含在JavaEE 6.0中。JSR-303通过在Bean属性上标注类似于 @NotNull、@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证

  1. 知识剖析

JSR-303定义了一套可标注在成员变量、属性方法上的校验注解,

@Null 被注解的元素必须为null

@AssertTrue 被注解的元素必须为true

@AssertFalse 被注解的元素必须为false

@Max(value) 必须为数字,其值必须大于指定的最大值

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

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

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

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

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

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

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

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

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

Spring校验框架

Spring拥有自己独立的数据校验框架,同时支持JSR-303标准的校验框架。

Spring的org.springframework.validation是校验框架所在的包。LocalValidatorFactoryBean既实现了 Spring的Validator接口,又实现了JSR-303的Validator接口。只要在Spring容器中定义一个LocalValidatorFactoryBean 即可将其注入需要数据校验的Bean中。

Spring MVC数据校验

mvc:annotation-driven/ 会默认装配一个LocalValidatorFactoryBean,通过在处理方法的入参上 标注@Valid注解,即可让Spring MVC在完成数据绑定后执行数据校验工作

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

通过国际化资源显示错误信息,Spring中定义了一个MessageSource接口,以用于支持信息的国际化和包含参数的信息的替换。ApplicationContext接口继承了MessageSource接口,所以我们所有的ApplicationContext实现类都实现了MessageSource接口,也就是我们我们可以通过ApplicationContext来调用MessageSource接口方法以实现信息的国际化和替换信息中包含的参数。

7.参考文献

参考资料:https://blog.csdn.net/u013815546/article/details/77248003

————使用spring validation完成数据后端校验

8.更多讨论

@Valid和@Validated的区别?

@Valid是javax.validation里的提供的,@Validated是@Valid 的一次封装,是Spring提供的校验机制使用。@Validated 提供分组功能,一般来说用@Valid就够用了。

如果要进行校验的实体类有多个属性校验错误怎么办?

BindingResult的getFieldErrors()方法可以获得全部的属性校验错误,返回值是一个List,里面的元素是FieldError类型的,还是需要toString()来获得字符串形式的错误信息。

error.getFieldErrors()

传入的参数不是实体类而是单个参数,如何进行校验?

可以在Controller类上加上 @Validated 注解,表示该类中的处理方法允许单个参数校验。在需要校验的参数前直接标注规则注解,像在实体类属性上标注一样,但是这种方法如果校验不通过的话,会直接抛出一个异常,可能需要一个ControllerAdvice全局异常处理来进行捕获。

9.鸣谢

感谢观看,如有出错,恳请指正

10.结束语

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

 类似资料: