数据校验

两种方式:一种是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 对象保存错误的方法。

View Code

 

4、LocalValidatorFactoryBean 该类  extends SpringValidatorAdapter   和  implements ValidatorFactory, ApplicationContextAware, InitializingBean, DisposableBean。只要在spring容器中定义一个 LocalValidatorFactoryBean ,即可将其注入到需要数据校验的bean 中。

View Code

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() 获取所有的错误信息。