摘自
1.加入Hibernate Validator的jar
2.在处理器适配器中配置校验器
在springmvc.xml中的自定义webBinder标签中加入如下标签:
<property name="validator" ref="validator"/>
这里引入了一个validator,所以我们需要在springmvc.xml中还需要加入validator的配置:
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<!-- 如果不指定则默认使用classpath下的ValidationMessages.properties -->
<property name="validationMessageSource" ref="messageSource" />
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>CustomValidationMessages</value>
</list>
</property>
<property name="fileEncodings" value="utf-8" />
<property name="cacheSeconds" value="120" />
</bean>
然后在src包下创建一个CustomValidationMessages.properties文件,内容为:
#校验提示信息:items.name.length.error要写在java代码中
items.name.length.error=商品名称的长度请限制在1到30个字符
items.createtime.is.notnull=请输入商品的生产日期
3.校验规则
需求:商品信息提交时校验 ,商品生产日期不能为空,商品名称长度在1到30字符之间。
另外首先需要知道的是规则应该在pojo对象的相应属性上规定。
修改pojo的Items.java内容如下:
public class Items {
private Integer id;
@Size(min = 1,max = 30,message = "{items.name.length.error}")
private String name;
private Float price;
private String pic;
@NotNull(message="{items.createtime.is.notnull}")
private Date createtime;
private String detail;
}
省略了相应的setter和getter方法。
通过上面的操作我们定义了校验的规则,那么当违反了上述规则后我们该如何捕获错误呢?需要修改controller方法,在要校验的pojo前边加上@Validated注解,在editItemSubmit()方法中添加如下内容:
//商品提交页面
//itemsQueryVo是包装类型的pojo
//在@Validated中定义使用ValidGroup1组下边的校验
@RequestMapping("/editItemSubmit")
public String editItemSubmit(Model model,Integer id,
@Validated @ModelAttribute(value = "itemsCustom") ItemsCustom itemsCustom,
BindingResult bindingResult,
//上传图片
MultipartFile pictureFile
) throws Exception
{
//输出校验错误信息
//如果参数绑定时出错
if (bindingResult.hasErrors())
{
//获取错误
List<ObjectError> errors=bindingResult.getAllErrors();
model.addAttribute("errors",errors);
for (ObjectError error:errors)
{
//输出错误信息
System.out.println(error.getDefaultMessage());
}
//如果校验错误,仍然回到商品修改页面
return "editItem";
}
....
}
然后是在页面editItem.jsp中展示错误:
<!--错误信息-->
<c:forEach items="${errors}" var="error">
<div color="red">${error.defaultMessage}<br/></div>
</c:forEach>
运行程序,在修改商品信息的页面当我们没有输入日起或是将商品名称超过了20个字符时便不能完成页面的跳转而是在该修改页面显示错误信息。
以上我们便通过Validation完成了校验。下面我们来谈谈分组校验:针对不同的controller方法通过分组校验达到个性化校验的目的。
4.分组校验
需求:修改商品修改功能,只校验生产日期不能为空。
第一步:创建分组接口,创建一个ValidGroup1.java接口:
public interface ValidGroup1
{
//接口不定义方法,相当于接口就是个类型,只标识哪些校验规则属于该ValidGroup1分组
}
第二步:定义校验规则属于哪个校验分组:
//通过groups指定此校验属于哪个分组,当然可以指定多个分组
@NotNull(message="{items.createtime.is.notnull}",groups = {ValidGroup1.class})
private Date createtime;
而属性name的校验规则没有添加groups属性。
第三步:在controller方法定义使用校验的分组。
public String editItemSubmit(Model model,Integer id,
@Validated(value = {ValidGroup1.class}) @ModelAttribute(value = "itemsCustom") ItemsCustom itemsCustom,
BindingResult bindingResult,
//上传图片
MultipartFile pictureFile
) throws Exception
{}
此时运行程序,在编辑商品信息页面中只会进行日期是否为空的校验,而不能进行商品名称信息的校验。因为在pojo的name属性中我们没有指定该校验规则属于哪个分组,所以在controller的方法中就无法定义使用该校验规则的分组,也就无法进行商品名称的校验。