数据校验
两种方式:一种是spring自带的 Validation校验框架,另一种是利用JSR 实现校验功能。
Spring的 Validation 校验框架
在 org.springframework.validation 包中重要的接口如下:
1、Validtor
public interface Validator {
/**
* 该校验能够对clazz类型的对象进行校验*/
boolean supports(Class<?> clazz);
/**
* 对目标类target进行校验,并将校验错误记录在errors当中*/
void validate(Object target, Errors errors);
}
2、Errors
package org.springframework.validation;
import java.util.List;
import org.springframework.beans.PropertyAccessor;
/**
* spring 用来存放错误信息的接口
*
* spring MVC 框架在将请求数据绑定到入参对象后,就会调用校验框架实施校验,
* 而校验结果保存在处理方法的入参对象之后的参数对象当中。
* 这个保存校验结果的参数对象必须是 Errors 或BingingResult 类型
* 一个Errors 对象中包含了一系列的 FileError 和 ObjectError 对象。
* FieldError 表示与被校验的对象中的某个属性相关的一个错误。
* BindingResult 扩展了Errors接口,同时获取数据绑定结果对象的信息。*/
public interface Errors {
String NESTED_PATH_SEPARATOR = PropertyAccessor.NESTED_PROPERTY_SEPARATOR;
String getObjectName();
void setNestedPath(String nestedPath);
String getNestedPath();
void pushNestedPath(String subPath);
void popNestedPath() throws IllegalStateException;
void reject(String errorCode);
void reject(String errorCode, String defaultMessage);
void reject(String errorCode, Object[] errorArgs, String defaultMessage);
void rejectValue(String field, String errorCode);
void rejectValue(String field, String errorCode, String defaultMessage);
void rejectValue(String field, String errorCode, Object[] errorArgs, String defaultMessage);
void addAllErrors(Errors errors);
boolean hasErrors();
int getErrorCount();
List<ObjectError> getAllErrors();
boolean hasGlobalErrors();
int getGlobalErrorCount();
List<ObjectError> getGlobalErrors();
ObjectError getGlobalError();
boolean hasFieldErrors();
int getFieldErrorCount();
List<FieldError> getFieldErrors();
FieldError getFieldError();
boolean hasFieldErrors(String field);
int getFieldErrorCount(String field);
List<FieldError> getFieldErrors(String field);
FieldError getFieldError(String field);
Object getFieldValue(String field);
Class<?> getFieldType(String field);
}
3、ValidationUtils spring提供的一个关于校验的工具类。它提供了多个给Errors 对象保存错误的方法。
4、LocalValidatorFactoryBean 该类 extends SpringValidatorAdapter 和 implements ValidatorFactory, ApplicationContextAware, InitializingBean, DisposableBean。只要在spring容器中定义一个 LocalValidatorFactoryBean ,即可将其注入到需要数据校验的bean 中。
bean的定义
<bean id="validator" class="org.springframework.validation.beanvalidation.localValidatorFactoryBean"/>
使用:实现接口,并用 @Repository("beanName") 注册一个bean,
@Autowired 、@Qualifier("beanName") 注入bean使用
JSR 校验
hibernate Validator
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-valiadtor</artifactId>
<version>5.3.5</version>
</dependency>
标注在成员变量上的注解:
@NUll 验证对象是否为空
@NoNull 验证对象是否不为null,但无法检查长度为 0 的字符串
@AssertTrue 验证对象是否为true
@AssertFalse 验证对象是否为 false
@Max(value) 验证number和string对象是否小于等于指定的值
@Min(value) 验证number和string对象是否大于等于指定的值
@DecimalMax(value) 被标注的值必须不大于约束中指定的最大值,这个约束的参数是一个通过BigDecimal 定义的最大值的字符串表示,小数存在精度
@DecimalMin(value) 被标注的值必须不小于约束中指定的最小值。这个约束的参数是一个通过BigDecimal 定义的最小值的字符串表示,小数存在精度
@Digits(integer,fraction) 验证字符串是否符合指定格式的数字,integer 指定整数精度,fraction指定小数精度
@Size(min,max) 验证对象(Array、Collection、Map、String)长度是否在给定的范围内
@Past 验证Date 和 Calendar 对象是否在当前时间之前
@Future 验证Date和Calendar 对象是否在当前时间之后
也可以用正则表示式验证:
@Pattern(regexp="",message = "请输入正确的。。。")
扩展:
@NotBlank 检查约束字符串是不是Null,被Trim 的长度是否大于0,只对字符串,且会去掉前后空格
@URL 验证是否合法的url
@Email 验证是否是合法的邮件地址
@CreditCardNUmber 验证是否是合法的信用卡号码
@Length(min,max) 验证字符串的长度必须在指定的范围内
@NotEmpty 检查元素是否为 null 或者 Empty 。用于Array Collection map String
@Range(min,max,message) 验证属性值必须在合适的范围内
使用:
controller 层接收数据时,使用 @Valid 注解,BindingResult result 中会有错误的信息,
result.hasErrors() 判断是否也有错误的信息。
result.getAllErrors() 获取所有的错误信息。