JSR303校验和验证器

pom.xml

Maven中添加依赖

1
2
3
4
5
6
7
8
9
10
11
<!--JSR 303校验-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.0.Final</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>

@Valid与@Validated

@Valid

@Valid注解用于校验,所属包为:javax.validation.Valid

POJO类

1
2
3
4
@Max(value = 40, message = "最大40岁")
@Min(value = 20, message = "最小20岁")
@NotNull(message = "不能为空")
private Integer age;

Controller层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//BindingResult对象,用于获取校验失败情况下的反馈信息
@RequestMapping("/insert")
public ModelAndView insert(@Valid Role role, BindingResult br) {
ModelAndView mv = new ModelAndView();
if (br.hasErrors()) {
List<FieldError> list = br.getFieldErrors();
for (FieldError error : list) {
System.out.println("field:"+error.getField()+","+"error:"+error.getDefaultMessage());
}
return null;
}
crudService.insert(role);
mv.setViewName("ok");
mv.addObject("msg", "增加成功");
return mv;
}

后台结果

1
2
3
fieldage,error:最小20岁
field:age,error:最大40岁
field:age,error:不能为空

@Validated

@Validated是@Valid的一次封装,是Spring提供的校验机制使用,所属包为:org.springframework.validation.annotation.Validated

JSR303定义的校验类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
空检查
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.

Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false

长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) Validates that the annotated string is between min and max included.

日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则

数值检查,建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null
@Min 验证 Number 和 String 对象是否大等于指定的值
@Max 验证 Number 和 String 对象是否小等于指定的值
@DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits 验证 Number 和 String 的构成是否合法
@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。

@Range(min=, max=) 检查数字是否介于min和max之间.
@Range(min=10000,max=50000,message="range.bean.wage")
private BigDecimal wage;

@Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
@CreditCardNumber信用卡验证
@Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=)

使用验证器自定义业务校验

注意:JSR303注解方式和验证器方式不能同时使用

自定义验证器需要实现Validator接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 判断当前验证器是否用于检验clazz类型的POJO
* @param clazz POJO类型
* @return true 启动检验,false则不再检验
*/

@Override
public boolean supports(Class<?> clazz) {
return false;
}

/**
* 检验POJO的合法性
* @param target POJO的请求对象
* @param errors 错误的信息
*/
@Override
public void validate(Object target, Errors errors) {

}

将它捆绑到对应的controller中

1
2
3
4
5
@InitBinder
public void initbinder(DataBinder db){
//数据绑定器加入验证器
db.setValidator(new ValidatorDemo());
}

实例

controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@InitBinder
public void initbinder(DataBinder db){
//数据绑定器加入验证器
db.setValidator(new ValidatorDemo());
}

@RequestMapping("/insert")
public ModelAndView insert(@Valid Role role, BindingResult br) {
ModelAndView mv = new ModelAndView();
if (br.hasErrors()) {
List<FieldError> list = br.getFieldErrors();
for (FieldError error : list) {
System.out.println("field:"+error.getField()+","+"error:"+error.getDefaultMessage());
}
return null;
}
crudService.insert(role);
mv.setViewName("ok");
mv.addObject("msg", "增加成功");
return mv;
}

自定义的验证器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class ValidatorDemo implements Validator {

/**
* 判断当前验证器是否用于检验clazz类型的POJO
* @param clazz POJO类型
* @return true 启动检验,false则不再检验
*/

@Override
public boolean supports(Class<?> clazz) {
//判断验证是否为Transactional,如果是则验证
return Role.class.equals(clazz);
}

/**
* 检验POJO的合法性
* @param target POJO的请求对象
* @param errors 错误的信息
*/
@Override
public void validate(Object target, Errors errors) {
Role role = (Role) target;
if(role.getAge()>15){
errors.rejectValue("age",null,"年龄不能大于15岁");
}
}
}

后台结果
field:age,error:年龄不能大于15岁

赏个🍗吧
0%