您的位置:首页 > 编程语言 > Java开发

Spring Boot Validator框架

2017-04-26 00:09 162 查看
1,简介

Springbootvalidator实际集成了Hibernatevalidator。主要是校验用户提交的数据的合理性的,比如是否为空了,密码长度是否大于6位,是否是纯数字的,等等。方便后台的数据合法性的校验。

2Demo

以新增用户为例,在页面上有两个元素:姓名输入框,密码输入库以及提交按钮。提交到后台之后,使用Validator进行校验,然后如果存在错误,转发到demo.html,我们先编写一个实体类接收用户的输入,以及使用Validator注解校验:
public class Demo{
private long id;
    @NotEmpty(message="姓名不能为空")
    private String name;
    
    @NotEmpty(message="密码不能为空")
    @Length(min=6,message="密码长度不能小于6位")
    private String password;
}


这个实体类在属性上加入了注解@NotEmpty,@Length。
@NotEmpty表示不能为空,message是它的错误提示信息。
@Length用来验证长度,min表示最小长度不能小于6。

3,详细介绍每个注解

名称
使用描述
例子

@null
验证对象是否为空

@notnull
验证对象是否为非空
@NotNull(message="身份证不能为空")

@asserttrue
验证boolean对象是否为true
@AssertTrue(message="")

@assertfalse
验证boolean对象是否为false
@AssertFalse(message="")

@min
验证number和string对象是否大等于指定的值
@Min(value=18,message="必须年满18岁!")

@max

验证number和string对象是否小等于指定的值
@Max(value=100,message="年龄不能大于100岁")

@length
验证string的长度
@Length(min = 5, max = 20, message = "用户名长度必须位于5到20之间")
@decimalmin
验证number和string对象是否大等于指定的值,小数存在精度
@DecimalMax(value="100",message="decim最大值是100")

@decimalmax
验证number和string对象是否小等于指定的值,小数存在精度
DecimalMin(value="100",message="decim最小值是100")

@size
验证对象(array,collection,map,string)长度是否在给定的范围之内
@size(min=6,max=20,message="密码长度只能在6-20之间")
@digits
验证number和string的构成是否合法
@Digits(integer=2,fraction=20)

@past
验证date和calendar对象是否在当前时间之前
@Past(message=””)
@future
验证date和calendar对象是否在当前时间之后
@Future(message=””)
@pattern
验证String对象是否符合正则表达式的规则
@Pattern(regexp="[a-za-z0-9._%+-]+@[a-za-z0-9.-]+\\.[a-za-z]{2,4}",message="邮件格式错误")
@Email
验证邮箱
@Email(message = "输入正确的邮箱")  
4,进阶(@ScriptAssert
如果需要校验的业务逻辑比较复杂,简单的@NotBlank,@Min注解已经无法满足需求了,这时可以使用@ScriptAssert来指定进行校验的方法,通过方法来进行复杂业务逻辑的校验,然后返回true或false来表明是否校验成功。例如下面的例子:
//通过script属性指定进行校验的方法,传递校验的参数,
@ScriptAssert(lang="javascript",script="com.learn.validate.domain.Student.checkParams(_this.name,_this.age,_this.classes)"messgae="")
publicclassStudent{
privateStringname;
privateintage;
privateStringclassess;
//注意进行校验的方法要写成静态方法,否则会出现
//TypeError:xxxisnotafunction的错误
publicstaticbooleancheckParams(Stringname,intage,Stringclasses){
if(name!=null&&age>8&classes!=null){
returntrue;
}else{
returnfalse;
}
}
}

5,自定义验证规则

有时候默认的规则可能还不够,有时候还需要自定义规则,比如屏蔽关键词验证是非常常见的一个功能,比如在发帖时帖子中不允许出现admin等关键词。
1、定义验证注解

@Target({FIELD,METHOD,PARAMETER,ANNOTATION_TYPE})
@Retention(RUNTIME)
//指定验证器
@Constraint(validatedBy=ForbiddenValidator.class)
@Documented
public@interfaceForbidden{
//默认错误消息
Stringmessage()default"{forbidden.word}";
//分组
Class<?>[]groups()default{};
//负载
Class<?extendsPayload>[]payload()default{};
//指定多个时使用
@Target({FIELD,METHOD,PARAMETER,ANNOTATION_TYPE})
@Retention(RUNTIME)
@Documented
@interfaceList{
Forbidden[]value();
}
}


2
、定义验证器


publicclassForbiddenValidatorimplementsConstraintValidator<Forbidden,String>{
privateString[]forbiddenWords={"admin"};
@Override
publicvoidinitialize(ForbiddenconstraintAnnotation){
//初始化,得到注解数据
}

@Override
publicbooleanisValid(Stringvalue,ConstraintValidatorContextcontext){
if(StringUtils.isEmpty(value)){
returntrue;
}
for(Stringword:forbiddenWords){
if(value.contains(word)){
returnfalse;//验证失败
}
}
returntrue;
}
}


3
、使用


publicclassUserimplementsSerializable{
@Forbidden()
privateStringname;
}


4
、当我们在提交
name
中含有
admin
的时候会输出错误消息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息