《SpringMVC从入门到放肆》十四、SpringMVC分组数据校验

上一篇我们学习了数据校验,但是在实际项目中,还是有些不够灵活,今天我们就来继续学习一种更灵活的数据校验方法——分组数据校验。

一、什么是分组校验

校验规则是定义在实体中的,而同一个实体可以被多个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进行校验,这样就实现了分组校验的目的。是不是很简单?


关于作者: 王俊南(Jonas)

昨夜寒蛩不住鸣。惊回千里梦,已三更。起来独自绕阶行。人悄悄,帘外月胧明。 白首为功名。旧山松竹老,阻归程。欲将心事付瑶琴。知音少,弦断有谁听。

热门文章