使用场景

在项目开发过程中,数据校验时必不可少的环节,有效的校验方式可以提高开发效率、增强代码可读和可维护性,项目开发中,我使用最多的校验方式是使用注解@Valid,但是这种方式往往只是在controller层对接收表单传递过来的参数进行校验,那么当我们想要在任何地方校验一个对象的数据是否合法,应该怎么实现呢,下面是具体的实现方法。

实现步骤

  • 在需要校验的实体类中添加注解标注
  • 在需要校验的地方使用 javax.validation.Validator进行校验

示例代码

需要校验的实体类示例代码

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public class ValidEntity {

/**
* 组织
*/
private String officeName;

/**
* 所属县市 id
*/
@NotBlank(message = "县(市、新区)不能为空")
private String county;

/**
* 户主姓名
*/
@NotBlank(message = "户主姓名不能为空")
private String householderName;

/**
* 身份证号
*/
@IDCardValidate
@NotBlank(message = "户主身份证不能为空")
private String householderIdCard;

/**
* 所属项目年度
*/
@NotBlank(message = "所属项目年度不能为空")
private String year;

/**
* 是否应拆旧房
*/
@NotBlank(message = "是否应拆除不能为空")
private String isDemolished;

/**
* 是否已拆除
*/
@NotBlank(message = "是否已拆除不能为空")
private String isConfirmDemolished;

/**
* 拆除面积
*/
private BigDecimal demolishedArea;

/**
* 是否已复垦复绿
*/
@NotBlank(message = "是否已复垦复绿不能为空")
private String isConfirmReclaimed;

/**
* 复垦复绿面积
*/
private BigDecimal reclaimedArea;
}

校验数据合法性

1
2
3
4
5
6
7
8
9
10
11
12
13
public class ValidTest {

@Autowired
private Validator validator;

public void validatorTest() {
ValidEntity validEntity = new ValidEntity();
Set<ConstraintViolation<ValidEntity>> violationSet = validator.validate(validEntity);
for (ConstraintViolation<ValidEntity> violation : violationSet) {
System.out.println(violation.getMessage());
}
}
}

结语

至此,对实体数据的合法性校验就完成了,其中比较核心的两个类的完整限定名如下:

javax.validation.ConstraintViolation

javax.validation.Validator