前言:
本章主要讲解spring中自带框架校验器和jsr 303(hibernate invalidator 实现)
一.实现spring接口
(1)spring 校验器接口
(2)spring 提供的校验类工具,可以提供相应的校验
(3)代码示例
a)自实现校验器:
package validation; import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; import domain.Product; public class ProductValidator implements Validator { @Override public boolean supports(Class<?> arg0) { // TODO Auto-generated method stub return Product.class.isAssignableFrom(arg0); } @Override public void validate(Object target, Errors errors) { // TODO Auto-generated method stub Product product = (Product)target; //非空校验 ValidationUtils.rejectIfEmpty(errors, "name", "productname.required"); ValidationUtils.rejectIfEmpty(errors, "price", "price.required"); ValidationUtils.rejectIfEmpty(errors, "productionDate", "productiondate.required"); Float price = product.getPrice(); //对价格进行合理性校验 if(price !=null && price < 0) { errors.rejectValue("price", "price.negative"); } } }
b)rest接口调用
@RequestMapping(value="/product_save") public String saveProduct(@ModelAttribute Product product,BindingResult bindingResult,RedirectAttributes redirectAttributes, Model model) { //实例化校验类 ProductValidator productValidator = new ProductValidator(); productValidator.validate(product, bindingResult); if(bindingResult.hasErrors()) { FieldError fieldError = bindingResult.getFieldError(); System.out.println("Code:"+fieldError.getCode()+",field:"+fieldError.getField()); return "ProductForm"; }
//校验成功后保存产品 Product product_save = productService.add(product); redirectAttributes.addFlashAttribute("message", "The product was successfully added."); return "redirect:/product_view/"+product_save.getId(); }
c)产品实体类
package domain; import java.io.Serializable; import javax.validation.constraints.Size; public class Product implements Serializable { /** * */ private static final long serialVersionUID = -5521544309275815404L; private long id; private String name; private String description; private float price; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public long getId() { return id; } public void setId(long id) { this.id = id; } }
二.使用 hibernate invalidator
hibernate invalidator提供了通过注解进行校验的框架。引入相应的jar包即可使用。
1、下载地址:http://hibernate.org/validator/releases/5.4/
2、导入红框中的jar:
3、hibernate invalidator 常用注解
4、使用方法:
(1)rest接口中使用(这里一个@Valid的参数后必须紧挨着一个BindingResult参数,否则spring会在校验不通过后直接返回,不进入rest接口)
@RequestMapping(value="/product_save") public String saveProduct(@Valid @ModelAttribute Product product,BindingResult bindingResult,RedirectAttributes redirectAttributes, Model model) { ;//处理校验出错 if(bindingResult.hasErrors()) { FieldError fieldError = bindingResult.getFieldError(); System.out.println("Code:"+fieldError.getCode()+",field:"+fieldError.getField()); return "ProductForm"; } //保存产品 Product product_save = productService.add(product); redirectAttributes.addFlashAttribute("message", "The product was successfully added."); return "redirect:/product_view/"+product_save.getId(); }
(2)普通方法中调(参考 http://www.cnblogs.com/yangzhilong/p/3724967.html)
public void validator( Product product) { //通过工厂类示理化校验器 Set<ConstraintViolation<Object>> validResult = Validation.buildDefaultValidatorFactory().getValidator().validate((Object)product); //处理校验失败 if (null != validResult && validResult.size() > 0) { StringBuilder sb = new StringBuilder(); for (Iterator<ConstraintViolation<Object>> iterator = validResult.iterator(); iterator.hasNext();) { ConstraintViolation<Object> constraintViolation = (ConstraintViolation<Object>) iterator.next(); System.out.println(constraintViolation.getMessage()); } if (sb.lastIndexOf("、") == sb.length() - 1) { sb.delete(sb.length() - 1, sb.length()); } } } }
(3)产品实体类需要使用相关注解,以下限制产品名的长度为1-10,当多个参数错误的,发现第一个参数错误后就会停止校验。
package domain; import java.io.Serializable; import javax.validation.constraints.Size; public class Product implements Serializable { /** * */ private static final long serialVersionUID = -5521544309275815404L; private long id; @Size(min =1 ,max = 10) private String name; private String description; private float price; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public long getId() { return id; } public void setId(long id) { this.id = id; } }