@valid注解可以实现数据的验证,你可以定义实体,在实体的属性上添加校验规则,而在api接收数据时添加@valid关键字,这时你的实体将会开启一个校验的功能,具体的代码如下,是最基本的应用:
实体:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class departmentdto { @apimodelproperty ( "id" ) private string id; @apimodelproperty ( "上级id" ) private string parentid; @apimodelproperty ( "编号" ) @notblank (message = "部门编号不能为空。" ) private string code; @apimodelproperty ( "名称" ) @notblank (message = "部门名称不能为空。" ) private string name; @apimodelproperty ( "员工集合" ) @builder . default private list<employee> employees = new arraylist<>(); } |
restful接口:
1
2
3
4
5
6
7
8
9
10
|
@postmapping () public response<clientaccount> initialaccount( @apiparam ( "客户编号" ) @pathvariable string code, @apiparam ( "账期" ) @pathvariable yearmonth accountperiod, @apiparam ( "请求体" ) @valid @requestbody request<departmentdto> request) { clientaccount result = clientaccountservice.initialaccount( code, accountperiod, request.getoperator(), request.getbody());{} |
上面代码中,我们为请求体request<departmentdto>
添加了校验,在测试时,如果你的departmnetdto.name为空字符时,当出现400的异常,丽时异常消息是『部门名称不能为空』,这对于我们来说是没有问题的,也是符合我们要求的,下面看另一个场景。
需要验证的实体是另一个实休的属性
这种方式我们也需要会看到,一个大对象,如被封装的其它小对象组成,比如部门下面有员工,这时如果需要验证员工的有效性,需要如何实现呢?如果我们不修改源代码,执行结果是否定的, 它并不会校验员工这个对象,而只针对第一层对象的属性 。
我们将实体的员工属性添加上@valid即可实现对这个属性的校验
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class departmentdto { @apimodelproperty ( "id" ) private string id; @apimodelproperty ( "上级id" ) private string parentid; @apimodelproperty ( "编号" ) @notblank (message = "部门编号不能为空。" ) private string code; @apimodelproperty ( "名称" ) @notblank (message = "部门名称不能为空。" ) private string name; @valid @apimodelproperty ( "员工集合" ) @builder . default private list<employee> employees = new arraylist<>(); } |
下面看一下验证结果,我们的400错误就可以在单元测试下面正常输出了!
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
|
@test public void initialaccount_employee_name_empty() { list<employee> employees = new arraylist<>(); employees.add(employee.builder() .name( "" ) .email( "zzl@sina.com" ) .idnumber( "110111198203182012" ) .build()); list<departmentdto> departments = new arraylist<>(); departments.add(departmentdto.builder() .name( "部门" ) .description( "技术部" ) .salarytype(salarytype.researchanddevelopmentcosts) .employees(employees) .build()); clientaccountdto clientaccountdto = clientaccountdto.builder() .name( "客户" ) .departments(departments) .build(); request<clientaccountdto> request = buildrequest(clientaccountdto); api.post() .uri( "/v1/12345/2018-03" ) .body(bodyinserters.fromobject(request)) .exchange() .expectstatus().isequalto( 400 ) .expectbody() .jsonpath( "$.errors[0].message" ).isequalto( "姓名不能为空" ); } |
结果如下,测试通过
如果是测试它是isok的话,由于用户名为空,所以会出现错误提示
1
2
3
4
5
|
api.post() .uri( "/v1/12345/2018-03" ) .body(bodyinserters.fromobject(request)) .exchange() .expectstatus().isok(); |
可以看一下结果的提示信息
总结
以上所述是小编给大家介绍的springboot @valid注解对嵌套类型的校验,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://www.cnblogs.com/lori/p/9088380.html