Hibernate validator使用以及自定义校验器注解
jsr-303 是 java ee 6 中的一项子规范,叫做 bean validation,用于对 java bean 中的字段的值进行验证。hibernate validator则是hibdernate提供的一种对该规范的实现。
——即hibernate validator是用来做参数校验。
使用hibernate validator提供的注解进行参数校验
注解 | 释义 |
---|---|
@null | 必须为null |
@notnull | 不能为null |
@asserttrue | 必须为true |
@assertfalse | 必须为false |
@min | 必须为数字,其值大于或等于指定的最小值 |
@max | 必须为数字,其值小于或等于指定的最大值 |
@decimalmin | 必须为数字,其值大于或等于指定的最小值 |
@decimalmax | 必须为数字,其值小于或等于指定的最大值 |
@size | 集合的长度 |
@digits | 必须为数字,其值必须再可接受的范围内 |
@past | 必须是过去的日期 |
@future | 必须是将来的日期 |
@pattern | 必须符合正则表达式 |
必须是邮箱格式 | |
@length | 长度范围 |
@notempty | 不能为null,长度大于0 |
@range | 元素的大小范围 |
@notblank | 不能为null,字符串长度大于0(限字符串) |
引入依赖
<dependency> <groupid>org.hibernate</groupid> <artifactid>hibernate-validator</artifactid> <version>6.0.15.final</version> </dependency>
hibernate validator常用注解
创建测试类
注意必须先进行为null判断,否则其他注解有的不会生效。
比如username加了@length而不加@notnull注解,当没有输入username,那么@length判断将不会生效,判断为null的有@notnull、@notempty以及@notblank
建议自行去掉@notnull再测试一下
package com.dfyang.validator.entity; import org.hibernate.validator.constraints.length; import org.hibernate.validator.constraints.range; import javax.validation.constraints.notblank; public class user { @notblank(message = "名称不能为空") private string name; @range(min = 1, max = 120, message = "年龄必须为1-120岁") private integer age; @notblank(message = "描述不能为空") private string description; @notnull @length(min = 6, max = 18, message = "用户名长度必须为6-18位") private string username; @notnull @length(min = 6, max = 18, message = "密码长度必须为6-18位") private string password; /** get、set方法 */ }
创建测试controller
@valid用在参数上,表示对该参数进行校验。
如果对参数校验发现有误,会将错误注入到bindingresult中
我们这里将错误进行打印,也可以直接抛出异常
package com.dfyang.validator.controller; import com.dfyang.validator.entity.user; import org.springframework.validation.bindingresult; import org.springframework.validation.objecterror; import org.springframework.web.bind.annotation.getmapping; import org.springframework.web.bind.annotation.responsebody; import org.springframework.web.bind.annotation.restcontroller; import javax.validation.valid; @restcontroller public class usercontroller { @getmapping("/insert") @responsebody public user insertuser(@valid user user, bindingresult result) { if (result.haserrors()) { for (objecterror error : result.getallerrors()) { system.err.println(error.getdefaultmessage()); } } return user; } }
输入 http://localhost:8080/insert?name=张三&descripyion=&age=0&username=123123
使用自定义校验器进行参数校验
创建自定义注解,用于判断年龄是否符合约束
package com.dfyang.validator.constraint; import javax.validation.constraint; import javax.validation.payload; import java.lang.annotation.elementtype; import java.lang.annotation.retention; import java.lang.annotation.retentionpolicy; import java.lang.annotation.target; /** * 性别约束 */ @target({ elementtype.field}) @retention(retentionpolicy.runtime) @constraint(validatedby = sexconstraintvalidator.class) public @interface sex { string message() default "性别有误"; class<?>[] groups() default { }; class<? extends payload>[] payload() default { }; }
判断注解的值是否符合约束,这里进行了为null判断,也可以不进行在多加一个@nutnull
package com.dfyang.validator.constraint; import javax.validation.constraintvalidator; import javax.validation.constraintvalidatorcontext; /** * 性别约束逻辑判断 */ public class sexconstraintvalidator implements constraintvalidator<sex, string> { @override public boolean isvalid(string value, constraintvalidatorcontext context) { return value != null && (value.equals("男") || value.equals("女")); } }
@target用于指定使用范围,该处限定只能在字段上使用
@retention(retentionpolicy.runtime)表示注解在运行时可以通过反射获取到
@constraint(validatedby = xxx.class)指定该注解校验逻辑
2.创建校验实体,使用hibernate validator自带注解以及自定义的注解
package com.dfyang.validator.entity; import com.dfyang.validator.constraint.sex; import org.hibernate.validator.constraints.length; import org.hibernate.validator.constraints.range; import javax.validation.constraints.notblank; import javax.validation.constraints.notnull; public class user { @notblank(message = "名称不能为空") private string name; @range(min = 1, max = 120, message = "年龄必须为1-120岁") private integer age; @sex private string sex; @notblank(message = "描述不能为空") private string description; @notnull(message = "用户名不能为空") @length(min = 6, max = 18, message = "用户名长度必须为6-18位") private string username; @notnull(message = "密码不能为空") @length(min = 6, max = 18, message = "密码长度必须为6-18位") private string password; /** 省略get、set */ }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。