上一篇我们学习了数据校验,但是在实际项目中,还是有些不够灵活,今天我们就来继续学习一种更灵活的数据校验方法——分组数据校验。
一、什么是分组校验
校验规则是定义在实体中的,而同一个实体可以被多个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进行校验,这样就实现了分组校验的目的。是不是很简单?