上一篇我们学习了数据校验,但是在实际项目中,还是有些不够灵活,今天我们就来继续学习一种更灵活的数据校验方法——分组数据校验。
一、什么是分组校验
校验规则是定义在实体中的,而同一个实体可以被多个Controller使用,此时就会有问题,即:不同的Controller方法对同一个实体进行校验,此时这些校验信息是共享在这不同的Controller方法中的,但是实际上每个Controller方法可能需要不同的校验,在这种情况下,就需要使用分组校验来解决这种问题。
或者说,一个实体中有很多属性,Controller中的方法一可能只需要校验实体中的属性1和属性2,而Controller中的方法二可能只需要校验实体中的属性3和属性4。这样的需求就需要用到分组校验了。
二、定义分组
其实就是定义空的接口,该接口的作用只作为分组标识来使用。
分组1:
代码语言:javascript复制package cn.itechyou.validate;
/**
* 分组1
* @author Wangjn
*
*/
public interface ValidateGroup1 {
}
分组2:
代码语言:javascript复制package cn.itechyou.validate;
/**
* 分组2
* @author Wangjn
*
*/
public interface ValidateGroup2 {
}
三、添加校验失败提示
user.name.notnull=姓名不能为空
user.age.size=年龄必须大于18周岁
user.address.notnull=地址不能为空
user.email.notnull=邮箱不能为空
四、新建实体
代码语言:javascript复制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
代码语言:javascript复制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进行校验,这样就实现了分组校验的目的。是不是很简单?