SpringMVC使用Hibernate的校验框架validation(和Hibernate没有关系)。
页面提交请求的参数,请求到Controller方法中,使用validation进行校验。除去使用校验Jar包外,还需要在SpringMVC.xml中来配置validation校验器。
classpath:validationMessageSource
将校验器注入到处理器适配器中
在validationMessageSource.properties中配置校验错误信息。如:
goods.name.size.msg=输入的名称长度在1到20个字符之间goods.time.isNULL=时间不能为空
public class Goods{ @Size(min=1,max=20,message="{goods.name.size.msg}") private String name; @NotNull(message="{goods.time.isNULL}") private Date time; //GET/SET Code...}
捕获校验错误信息:
在需要校验的controller方法的形参pojo前加入@Validated,pojo后面添加BindingResult bindingResult接收校验出错信息。
注:@Validation和BindingResult是配对出现的。并且形参顺序是固定的。public String edit(Model model,Integer id,@Validated GoodsCustom goodsCustom,BindingResult bindingResult) throws Exception{ //判断是否有错误信息 if(bindingResult.hasErrors()){ //输出错误信息 Listallerr = bindingResult.getAllErrors(); for(ObjectError oe : allerr){ //得到错误信息 oe.getDefaultMessage(); } }}
然后再controller方法中捕获的错误信息传到页面中
model.addAttribute("AllError",allerr);
分组校验:
在pojo中帝国一校验规则,而pojo是被多个controller所公用,当不同的controller方法对同一个pojo进行校验,但每个controller方法需要不同的校验规则。
综上所述,则需要定义多个校验分组(Java接口),分组中定义有校验规则。每个controller方法使用不同的校验分组。
public interface ValidatedGroupOne{ //接口中不需要定义任何方法,仅是对不同的校验规则进行分组 //如当前分组只校验名称长度}
在校验规则中用groups指定此校验属于那个分组,groups可以定义多个分组。
public class Goods{ @Size(min=1,max=20,message="{goods.name.size.msg}",groups={ValidatedGroupOne.class}) private String name; @NotNull(message="{goods.time.isNULL}") private Date time;}
在controller方法中使用分组校验:@Validated(value={分组校验接口.class})指定使用那个分组的校验。
public String edit(Model model,Integer id,@Validated(value={ValidatedGroupOne.class}) GoodsCustom goodsCustom,BindingResult bindingResult) throws Exception{}