Spring MVC 学习指南---第七章 验证器

前言:

本章主要讲解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;
    }
    
    
    
    

}










猜你喜欢

转载自blog.csdn.net/nash885/article/details/77351510