上一篇我们学习了数据校验, 但是在实际项目中, 还是有些不够灵活, 今天我们就来继续学习一种更灵活的数据校验方法 -- 分组数据校验.
一, 什么是分组校验
校验规则是定义在实体中的, 而同一个实体可以被多个 Controller 使用, 此时就会有问题, 即: 不同的 Controller 方法对同一个实体进行校验, 此时这些校验信息是共享在这不同的 Controller 方法中的, 但是实际上每个 Controller 方法可能需要不同的校验, 在这种情况下, 就需要使用分组校验来解决这种问题.
或者说, 一个实体中有很多属性, Controller 中的方法一可能只需要校验实体中的属性 1 和属性 2, 而 Controller 中的方法二可能只需要校验实体中的属性 3 和属性 4. 这样的需求就需要用到分组校验了.
二, 定义分组
其实就是定义空的接口, 该接口的作用只作为分组标识来使用.
分组 1:
- package cn.itechyou.validate;
- /**
- * 分组 1
- * @author Wangjn
- *
- */
- public interface ValidateGroup1 {
- }
分组 2:
- package cn.itechyou.validate;
- /**
- * 分组 2
- * @author Wangjn
- *
- */
- public interface ValidateGroup2 {
- }
三, 添加校验失败提示
user.name.notnull = 姓名不能为空
user.age.size = 年龄必须大于 18 周岁
user.address.notnull = 地址不能为空
user.email.notnull = 邮箱不能为空
四, 新建实体
- package cn.itechyou.entity;
- import javax.validation.constraints.NotNull;
- import javax.validation.constraints.Size;
- import cn.itechyou.validate.ValidateGroup1;
- import cn.itechyou.validate.ValidateGroup2;
- public class SysPersonInfo {
- @NotNull(message = "{user.name.notnull}",groups={ValidateGroup1.class})
- private String name;
- @Size(message = "{user.age.notnull}",groups={ValidateGroup1.class})
- private int age;
- @NotNull(message = "{user.address.notnull}",groups={ValidateGroup2.class})
- private String address;
- @Size(message = "{user.email.notnull}",groups={ValidateGroup2.class})
- private String email;
- // 此处省略 getter,setter
- }
五, 开发 Controller
- package cn.itechyou.controller;
- import java.util.List;
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.validation.BindingResult;
- import org.springframework.validation.ObjectError;
- import org.springframework.validation.annotation.Validated;
- import org.springframework.web.bind.annotation.RequestMapping;
- import cn.itechyou.entity.SysPersonInfo;
- import cn.itechyou.validate.ValidateGroup1;
- import cn.itechyou.validate.ValidateGroup2;
- @Controller
- @RequestMapping("/person")
- public class PersonController {
- /**
- * 注册
- * @param model
- * @param person
- * @param result
- * @return
- */
- @RequestMapping("/reg")
- public String reg(Model model, @Validated(value = { ValidateGroup1.class }) SysPersonInfo person,
- BindingResult result) {
- if(result.hasErrors()) {
- List<ObjectError> allErrors = result.getAllErrors();
- for (ObjectError objectError : allErrors) {
- System.out.println(objectError.getDefaultMessage());
- }
- model.addAttribute("errors", allErrors);
- return "login";
- }
- return "success";
- }
- /**
- * 修改信息
- * @param model
- * @param person
- * @param result
- * @return
- */
- @RequestMapping("/modify")
- public String modify(Model model, @Validated(value = { ValidateGroup2.class }) SysPersonInfo person,
- BindingResult result) {
- if(result.hasErrors()) {
- List<ObjectError> allErrors = result.getAllErrors();
- for (ObjectError objectError : allErrors) {
- System.out.println(objectError.getDefaultMessage());
- }
- model.addAttribute("errors", allErrors);
- return "login";
- }
- return "success";
- }
- }
上面 Controller 有两个方法, 第一个是注册, 我们只对 name 和 age 进行校验, 第二个方法是修改信息, 我们只对 address 和 email 进行校验, 这样就实现了分组校验的目的. 是不是很简单?
来源: https://www.cnblogs.com/xinhudong/p/10577337.html