上一篇我们学习了数据校验,但是在实际项目中,还是有些不够灵活,今天我们就来继续学习一种更灵活的数据校验方法——分组数据校验。
一、什么是分组校验
校验规则是定义在实体中的,而同一个实体可以被多个Controller使用,此时就会有问题,即:不同的Controller方法对同一个实体进行校验,此时这些校验信息是共享在这不同的Controller方法中的,但是实际上每个Controller方法可能需要不同的校验,在这种情况下,就需要使用分组校验来解决这种问题。
或者说,一个实体中有很多属性,Controller中的方法一可能只需要校验实体中的属性1和属性2,而Controller中的方法二可能只需要校验实体中的属性3和属性4。这样的需求就需要用到分组校验了。
二、定义分组
其实就是定义空的接口,该接口的作用只作为分组标识来使用。
分组1:
1package cn.itechyou.validate;
2
3/**
4 * 分组1
5 * @author Wangjn
6 *
7 */
8public interface ValidateGroup1 {
9
10}
分组2:
1package cn.itechyou.validate;
2
3/**
4 * 分组2
5 * @author Wangjn
6 *
7 */
8public interface ValidateGroup2 {
9
10}
三、添加校验失败提示
1user.name.notnull=姓名不能为空
2user.age.size=年龄必须大于18周岁
3user.address.notnull=地址不能为空
4user.email.notnull=邮箱不能为空
四、新建实体
1package cn.itechyou.entity;
2
3import javax.validation.constraints.NotNull;
4import javax.validation.constraints.Size;
5
6import cn.itechyou.validate.ValidateGroup1;
7import cn.itechyou.validate.ValidateGroup2;
8
9public class SysPersonInfo {
10 @NotNull(message = "{user.name.notnull}",groups={ValidateGroup1.class})
11 private String name;
12 @Size(message = "{user.age.notnull}",groups={ValidateGroup1.class})
13 private int age;
14 @NotNull(message = "{user.address.notnull}",groups={ValidateGroup2.class})
15 private String address;
16 @Size(message = "{user.email.notnull}",groups={ValidateGroup2.class})
17 private String email;
18
19 //此处省略getter、setter
20
21}
五、开发Controller
1package cn.itechyou.controller;
2
3import java.util.List;
4
5import org.springframework.stereotype.Controller;
6import org.springframework.ui.Model;
7import org.springframework.validation.BindingResult;
8import org.springframework.validation.ObjectError;
9import org.springframework.validation.annotation.Validated;
10import org.springframework.web.bind.annotation.RequestMapping;
11
12import cn.itechyou.entity.SysPersonInfo;
13import cn.itechyou.validate.ValidateGroup1;
14import cn.itechyou.validate.ValidateGroup2;
15
16@Controller
17@RequestMapping("/person")
18public class PersonController {
19
20 /**
21 * 注册
22 * @param model
23 * @param person
24 * @param result
25 * @return
26 */
27 @RequestMapping("/reg")
28 public String reg(Model model, @Validated(value = { ValidateGroup1.class }) SysPersonInfo person,
29 BindingResult result) {
30 if(result.hasErrors()) {
31 List<ObjectError> allErrors = result.getAllErrors();
32 for (ObjectError objectError : allErrors) {
33 System.out.println(objectError.getDefaultMessage());
34 }
35 model.addAttribute("errors", allErrors);
36 return "login";
37 }
38 return "success";
39 }
40
41 /**
42 * 修改信息
43 * @param model
44 * @param person
45 * @param result
46 * @return
47 */
48 @RequestMapping("/modify")
49 public String modify(Model model, @Validated(value = { ValidateGroup2.class }) SysPersonInfo person,
50 BindingResult result) {
51 if(result.hasErrors()) {
52 List<ObjectError> allErrors = result.getAllErrors();
53 for (ObjectError objectError : allErrors) {
54 System.out.println(objectError.getDefaultMessage());
55 }
56 model.addAttribute("errors", allErrors);
57 return "login";
58 }
59 return "success";
60 }
61}
上面Controller有两个方法,第一个是注册,我们只对name和age进行校验,第二个方法是修改信息,我们只对address和email进行校验,这样就实现了分组校验的目的。是不是很简单?