Spring MVC有多种校验机制,有Bean Validation及Spring 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
----检测实体封装类JavaBean中的数据(检验对象的属性值)
第一步:在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){
}