一,环境准备
二,配置校验器
在springmvc.xml中配置校验器
<!-- 校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<!--指定校验使用的文件,在文件中配置配置校验错误信息,不设置则默认为classpath下的 ValidationMessages.properties -->
<property name="validationMessageSource" ref="validatemessageSource"/>
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="validatemessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名 -->
<property name="basename">
<list>
<value>classpath:CustomValidationMessages</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="utf-8" />
<!-- 默认编码:一定要配置这个,要不然会出现乱码 -->
<property name="defaultEncoding" value="utf-8" />
<!-- 对资源文件缓存时间,单位秒 -->
<property name="cacheSeconds" value="120"/>
</bean>
三,注入适配器中
<!--开启注解扫描,并将校验器注入到适配器中-->
<mvc:annotation-driven conversion-service="conversionService" validator="validator"></mvc:annotation-driven>
四,在pojo中添加校验规则
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class Items {
private Integer id;
//校验信息 商品名字在1-30个字符之间
@Size(min=1,max=30,message="{items.name.longError}")
private String name;
private Float price;
private String pic;
//校验信息 生成日期不能为空
@NotNull(message="{items.createtime.NullError}")
private String createtime;
private String detail;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic == null ? null : pic.trim();
}
public String getCreatetime() {
return createtime;
}
public void setCreatetime(String createtime) {
this.createtime = createtime;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail == null ? null : detail.trim();
}
}
五,配置validation的配置文件CustomValidationMessages.properties
可以在文件中配置错误信息,也可以在pojo类中添加校验信息的时候,在message中配置错误信息:如@Size(min=1,max=30,message=“商品名字不规范”).但一般不推荐这种方法,而在配置文件中配置错误信息
# 配置错误信息
items.name.longError = 商品名字长度不规范
items.createtime.NullError = 商品生成日期不能为空
六,捕获校验错误信息
//商品信息修改提交
//在需要校验的pojo前添加@Validated,在需要校验的pojo后面添加BindingResult,接收校验出错信息
//注意@Validated,BindingResul是配对出现的,并且必须一个在前一个在后,有多少个需要校验的pojo就需要多少对@Validated BindingResul
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(Model model,
@Validated ItemsCustom itemsCustom ,BindingResult bindingResult) throws Exception{
//获取校验错误信息
if(bindingResult.hasErrors()){
List<ObjectError> objectErrors = bindingResult.getAllErrors();
//输出错误
for (ObjectError objectError : objectErrors) {
System.out.println(objectError.getDefaultMessage());
}
//将错误信息传到页面
model.addAttribute("itemsErrors", objectErrors);
//返回修改页面
return "forward:editItems.action";
}
//修改商品信息
ItemsService.updateItems(itemsCustom);
//页面转发
return "forward:queryItems.action";
}
七,分组校验
在pojo中定义校验规则,而pojo被多个controller所共用,不同的controller方法对同一个pojo进行校验,但每个方法需要不同的校验.所以需要将校验规则进行分组
创建接口
public interface ValidGroupOne {
//接口不需要定义任何方法,仅对不同的校验规则进行分组
//此组只校验商品的长度
}
在pojo中添加分组
在controller方法中使用指定的分组校验