Validation校验----数据校验和分组校验

Spring MVC有多种校验机制,有Bean ValidationSpring Validator接口校验。在Spring4.0之后,支持Bean Validation1.0和Bean Validation1.1校验,可也以单独集成Hibernate的validation校验框架,若要使用Bean Validation校验机制,需要添加相关jar包。

hibernate-validator-4.3.0.Final.jar   ---是Hibernate的一个验证框架,包含了Bean Validation的校验约束拓展

jboss-logging-3.1.0.CR2.jar    ---上面的jar包,依赖于它

validation-api-1.0.0.GA.jar    ---提供了Bean Validation的基本校验机制,以及用于xml文档验证的api

 

Bean Validation数据校验

                              ----检测实体封装类JavaBean中的数据(检验对象的属性值)

搭建validation校验框架

第一步:在annotation-driven的注解驱动配置上添加一个validator属性,指定一个“validator”值,该值为“校验器”的名称

第二步:在springmvc中添加名为“validator”的校验器配置

 

	
	

此配置定义了一个id为"validator"的校验器,校验器提供类是“HibernateValidator”,而validationMessageSource指定的是验证使用的资源文件,在该文件中配置校验的错误信息。若不手动指定校验资源文件,就会默认使用classpath下的ValidationMessage.properties。

第三步:自己定义validationMessageSource对应的错误信息配置文件,在springmvc.xml中添加id为messageSource的资源属性文件配置:


	
		
			
				classpath:ProductValidationMessages
			
		
		
		
	

其中basenames为指定资源文件名,fileEncodings为资源文件编码格式,cacheSeconds为资源文件内容的缓存时间(单位秒);可以在basenames配置中添加多个资源文件的配置信息。

第四步:创建配置文件ProductValidationMessages.properties,用来配置校验配置信息

##添加校验错误提示信息
fruits.name.length.error=请输入1到20个字符的商品名称
fruits.producing_area.isEmpty=请输入商品的生产地

第五步:由于该校验机制是给处理器Controller使用的,而加载和调用处理器的是处理器适配器HandlerAdapter,故要为处理器适配器的配置添加校验器

                                                       

由于validator还需要检测前台传来的将字符串日期、数字类型数据是否正确,所以在conversion-service属性中配置了一个可以将字符串转换成Date类型或数字类型的Java类,配置 如下:

   到此为止,validation校验框架搭建完成。

添加校验注解信息

      打开Fruits的JavaBean类,在名称和生产地上添加校验的注解信息.

public class Fruits{
    private int id;
    
    @Size(min=1,max=20,message="{fruits.name.length.error}")
    private String name;

    private double price;
    
    @NotEmpty(message="{fruits.producing_area.isEmpty}")
    private String producing_area;
    
    //set,get省略

}

@Size注解,指定了其最小值(min)和最大值(max)字符限制,message用来提示校验出错误时显示的错误信息;校验非空使用的注解为@NotEmpty,其中也指定了message错误信息。

接下来在Controller方法中捕捉校验信息:

@RequestMapping("queryFruitsByCondition")
public String queryFruitsByCondition(Model model,@Validated Fruits fruits,BindingResult bindingReult){
    // 获取校验错误信息
    List allErrors = null;
    if(bindingResult.hasError()){
        allErrors = bindingResult.getAllErrors();
        for(ObjectError objectError:allErrors){
            //输出错误信息
            System.out.println(objectError.getDefaultMessage());
        }
    }
    //others

}

这里,在Controller方法的形参fruits前面添加了@Validated注解,在后面添加了BindingResult类。一般会在需要校验的Bean形参前面加@Validated注解,标注该参数需要执行Validated校验,而在需要校验的Bean形参后面添加BindingResult参数接收校验的出错信息。

小贴士:@Validated和BindingResult注解是成对出现的,并且在形参中出现的顺序是固定的(一前一后)。

若果想在页面中显示返回的错误信息,也很简单:

//将错误信息传到界面
model.setAttribute("allErrors",allErrors);

然后在界面定义一个div,专门用来显示错误信息



    
        ${error.defaultMessage}

分组校验

       当使用Bean Validation校验框架的时候,一般都会将校验信息配置在对于的JavaBean中,如上面的Fruits实体类。这样一来,所有使用该实体类Bean的Controller类对应的方法都要进行一次校验。

      直接定义在JavaBean中的校验注解,需要满足当JavaBean被多个Contrroller所共用时,每个Controller方法对该JavaBean有不同的校验规则。

设置分组检验

              将不同的校验规则分给不同的组,在使用时,指定不同的校验规则

第一步:创建两个接口:

//校验分组1
public interface FruitsGroup1{

    //接口中不需要定义任何方法,仅对不同的校验规则进行分组
}



//校验分组2
public interface FruitsGroup2{

    //接口中不需要定义任何方法,仅对不同的校验规则进行分组
}

第二步:将Fruits实体类中的两个校验分配给不同的组

public class Fruits{
    private int id;
    
    @Size(min=1,max=20,message="{fruits.name.length.error}",groups={FruitsGroup1.class})
    private String name;

    private double price;
    
    @NotEmpty(message="{fruits.producing_area.isEmpty}",groups={FruitsGroup2.class})
    private String producing_area;
    
    //set,get省略

}

第三步:在Controller中指定实体类校验规则所属组时,只需要在该实体类前面的@Validated注解中添加一个value值即可,该value值指定校验规则所在的接口:

@RequestMapping("queryFruitsByCondition")
public String queryFruitsByCondition(Model model,@Validated(value=FruitsGroup1.class)         
    Fruits fruits,BindingResult bindingReult){
   

}

 

你可能感兴趣的:(Spring,mvc)