Java参数验证Bean Validation 框架
2023-09-11 14:18:08 时间
1、为什么要做参数校验?
参数校验和业务逻辑代码分离,参数校验代码复用,统一参数校验方式、校验不太通过时统一异常描述。
2、bean validation规范
JSR303 规范(Bean Validation 规范)提供了对 Java EE 和 Java SE 中的 Java Bean 进行验证的方式。该规范主要使用注解的方式来实现对 Java Bean 的验证功能,并且这种方式会覆盖使用 XML 形式的验证描述符,从而使验证逻辑从业务代码中分离出来。JSR303注解如下:
Hibernate validator 在JSR303的基础上对校验注解进行了扩展,扩展注解如下:
Spring validtor 同样扩展了jsr303,并实现了方法参数和返回值的校验
JSR和Hibernate validator的校验只能对Object的属性进行校验,不能对单个的参数进行校验,spring 在此基础上进行了扩展,添加了MethodValidationPostProcessor拦截器,可以实现对方法参数的校验。
3、注意事项
Bean Validation 规范规定在对 Java Bean 进行约束验证前,目标元素必须满足以下条件:
- 如果验证的是属性(getter 方法),那么必须遵从 Java Bean 的命名习惯(JavaBeans 规范);
- 静态的字段和方法不能进行约束验证;
- 约束适用于接口和基类;
- 约束注解定义的目标元素可以是字段、属性或者类型等;
- 可以在类或者接口上使用约束验证,它将对该类或实现该接口的实例进行状态验证;
- 字段和属性均可以使用约束验证,但是不能将相同的约束重复声明在字段和相关属性(字段的 getter 方法)上。
接口完成级联验证的方式就是使用 @Valid 注解,在Controler中级联验证用@Validated。
对同一个Model,我们在增加和修改时对参数的校验也是不一样的,这个时候我们就需要定义分组验证。
public class Person {
private long id; /** * 添加groups 属性,说明只在特定的验证规则里面起作用,不加则表示在使用Deafault规则时起作用 */ @NotNull(groups = {PersonAddView.class, PersonModifyView.class}, message = "添加、修改用户时名字不能为空", payload = ValidateErrorLevel.Info.class) @ListNotHasNull.List({ @ListNotHasNull(groups = {PersonAddView.class}, message = "添加上Name不能为空"), @ListNotHasNull(groups = {PersonModifyView.class}, message = "修改时Name不能为空")}) private String name; @NotNull(groups = {PersonAddView.class}, message = "添加用户时地址不能为空") private String address; @Min(value = 18, groups = {PersonAddView.class}, message = "姓名不能低于18岁") @Max(value = 30, groups = {PersonModifyView.class}, message = "姓名不能超过30岁") private int age; //getter setter 方法...... }
/** * 添加一个Person对象 * 此处启用PersonAddView 这个验证规则 * 备注:此处@Validated(PersonAddView.class) 表示使用PersonAndView这套校验规则,若使用@Valid 则表示使用默认校验规则, * 若两个规则同时加上去,则只有第一套起作用 */ @RequestMapping(value = "/person", method = RequestMethod.POST) public void addPerson(@RequestBody @Validated({PersonAddView.class, Default.class}) Person person) { System.out.println(person.toString()); } /** * 修改Person对象 * 此处启用PersonModifyView 这个验证规则 */ @RequestMapping(value = "/person", method = RequestMethod.PUT) public void modifyPerson(@RequestBody @Validated(value = {PersonModifyView.class}) Person person) { System.out.println(person.toString());
}
Java Bean Validation 最佳实践 - 北言 - 博客园
相关文章
- java -version 问题 : C:ProgramDataOracleJavajavapath;
- Java实现 洛谷 P1010 幂次方
- java实现第六届蓝桥杯熊怪吃核桃
- Java实现第十届蓝桥杯数的分解
- Java实现 蓝桥杯VIP 算法训练 Hankson的趣味题
- Java实现 蓝桥杯 算法提高 因式分解
- 【JAVA】java中split以"." 、""、“|”分隔字符串
- Java NIO框架--Netty4的简单示例
- 【JAVA】MacBook安装Java环境及eclipse
- 【JAVA】java中char类型数组用数组名打印结果不是地址值而是数组内容
- java集合框架01——总体框架一览
- Java并发容器--DelayQueue延迟队列使用示例
- GcExcel Java Edition 6.0.6 Crack
- 【项目实战】并发编程之ScheduledExecutorService(Java提供的一个定时任务框架)入门介绍
- 开源 java CMS - FreeCMS2.3 留言管理
- mysql-connector-java与Mysql、Java的对应版本
- Java开发入门到精通之最常见的五个问题
- 下载各个版本java (Java Development Kit)
- 【JAVA面试必会】JMM高并发详解(java内存模型、JMM三大特征、volatile关键字 )
- 【项目实战】一文汇总所有常见的Java定时任务框架介绍