java规则验证框架_Java参数验证Bean Validation 框架

本文介绍了Java参数校验的重要性,详细讲解了Bean Validation规范,包括JSR303、Hibernate Validator和Spring Validator的扩展。同时,讨论了注意事项,如约束验证的条件、接口级联验证和分组验证的实现,以及在Controller中如何应用@Validated进行方法参数的校验。
摘要由CSDN通过智能技术生成

1、为什么要做参数校验?

参数校验和业务逻辑代码分离,参数校验代码复用,统一参数校验方式、校验不太通过时统一异常描述。

2、bean validation规范

JSR303 规范(Bean Validation 规范)提供了对 Java EE 和 Java SE 中的 Java Bean 进行验证的方式。该规范主要使用注解的方式来实现对 Java Bean 的验证功能,并且这种方式会覆盖使用 XML 形式的验证描述符,从而使验证逻辑从业务代码中分离出来。JSR303注解如下:

a42a4a1c2c62def7da71b287808d64c6.png

Hibernate validator 在JSR303的基础上对校验注解进行了扩展,扩展注解如下:

4a572eddc027d67e212754dc1f12d534.png

Spring validtor 同样扩展了jsr303,并实现了方法参数和返回值的校验

JSR和Hibernate validator的校验只能对Object的属性进行校验,不能对单个的参数进行校验,spring 在此基础上进行了扩展,添加了MethodValidationPostProcessor拦截器,可以实现对方法参数的校验。

3、注意事项

Bean Validation 规范规定在对 Java Bean 进行约束验证前,目标元素必须满足以下条件:如果验证的是属性(getter 方法),那么必须遵从 Java Bean 的命名习惯(JavaBeans 规范);

静态的字段和方法不能进行约束验证;

约束适用于接口和基类;

约束注解定义的目标元素可以是字段、属性或者类型等;

可以在类或者接口上使用约束验证,它将对该类或实现该接口的实例进行状态验证;

字段和属性均可以使用约束验证,但是不能将相同的约束重复声明在字段和相关属性(字段的 getter 方法)上。

接口完成级联验证的方式就是使用 @Valid 注解,在Controler中级联验证用@Validated。

对同一个Model,我们在增加和修改时对参数的校验也是不一样的,这个时候我们就需要定义分组验证。

publicclassPerson {private longid;/*** 添加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不能为空")})privateString name;

@NotNull(groups= {PersonAddView.class}, message = "添加用户时地址不能为空")privateString address;

@Min(value= 18, groups = {PersonAddView.class}, message = "姓名不能低于18岁")

@Max(value= 30, groups = {PersonModifyView.class}, message = "姓名不能超过30岁")private intage;//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());

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值