自定义校验信息

整体架构:

自定义校验信息


1.对类进行添加校验

package cn.itcast.ssm.po;


import java.util.Date;


import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;


import cn.itcast.ssm.controller.validation.ValidGroup1;


public class Items {
    private Integer id;
    
    //商品名称的长度请限制在1到30个字符
    @Size(min=1,max=30,message="{items.name.length.error}")
    private String name;


    private Float price;


    private String pic;
    
    //请输入商品生产日期
    //通过groups指定此校验属于哪个分组,可以指定多个分组
    @NotNull(message="{items.createtime.is.notnull}",groups={ValidGroup1.class})
    private Date 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 Date getCreatetime() {
        return createtime;
    }


    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }


    public String getDetail() {
        return detail;
    }


    public void setDetail(String detail) {
        this.detail = detail == null ? null : detail.trim();
    }
}

2.配置校验注册添加到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="messageSource" />
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名 -->
<property name="basenames">
<list>
<value>classpath:CustomValidationMessages</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="utf-8" />
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="cacheSeconds" value="120" />
</bean>

3.在controller捕获校验信息并显示

@RequestMapping("/editItemSubmit")
// public String editItemSubmit(Integer id,ItemsCustom itemsCustom,
// ItemsQueryVo itemsQueryVo)throws Exception{
public String editItemSubmit(Model model,Integer id,
@Validated(value={ValidGroup1.class}) @ModelAttribute(value="itemsCustom") ItemsCustom itemsCustom,
BindingResult bindingResult,
//上传图片
MultipartFile pictureFile
)throws Exception{

//输出校验错误信息
//如果参数绑定时有错
if(bindingResult.hasErrors()){

//获取错误 
List<ObjectError> errors = bindingResult.getAllErrors();
//准备在页面输出errors,页面使用jstl遍历
model.addAttribute("errors", errors);
for(ObjectError error:errors){
//输出错误信息
System.out.println(error.getDefaultMessage());
}
//如果校验错误,回到商品修改页面
return "editItem";
}

//进行数据回显
model.addAttribute("id", id);
//model.addAttribute("item", itemsCustom);
//进行图片上传
if(pictureFile!=null && pictureFile.getOriginalFilename()!=null && pictureFile.getOriginalFilename().length()>0){
//图片上传成功后,将图片的地址写到数据库
String filePath = "F:\\develop\\upload\\temp\\";
//上传文件原始名称
String originalFilename = pictureFile.getOriginalFilename();
//新的图片名称
String newFileName = UUID.randomUUID() +originalFilename.substring(originalFilename.lastIndexOf("."));
//新文件
File file = new java.io.File(filePath+newFileName);

//将内存中的文件写入磁盘
pictureFile.transferTo(file);

//图片上传成功,将新图片地址写入数据库
itemsCustom.setPic(newFileName);
}

//调用service接口更新商品信息
itemsService.updateItems(id, itemsCustom);

//提交后回到修改页面
//return "editItem";
//请求重定向
return "redirect:queryItems.action";
//转发
// return "forward:queryItems.action";
}

4.编写校验分组,只许定义一个接口即可

public interface ValidGroup1 {
//接口不定义方法,就是只标识 哪些校验 规则属于该 ValidGroup1分组
}

5.Hibernate的校验框架validation所需要的jar包

hibernate-validate-4.3.0.Final.jar

jboss-logging-3.1.0.CR2.jar

validation-api-1.0.0.GA.jar

6.定义错误信息CustomValidationMessages

#校验提示信息,items.name.length.error要写在java代码中
items.name.length.error=商品名称的长度请限制在1到30个字符
items.createtime.is.notnull=请输入商品生产日期