(七) SpringMVC 参数效验

(七) SpringMVC 参数效验

 

简介:

       Spring 支持 JSR-303 验证框架,JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是 Hibernate Validator(与Hibernate ORM没有关系),JSR-303 用于对 Java Bean 中的字段的值进行验证。
官网:  http://hibernate.org/validator/documentation/

1 、普通校验

maven 依赖:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>6.1.0.Final</version> 
</dependency>

接下来,在 Bean:

<bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" id="validatorFactoryBean"> 
    <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> 
</bean> 
<mvc:annotation-driven validator="validatorFactoryBean"/>

配置时,提供一个 LocalValidatorFactoryBean 的实例,然后 Bean 的校验使用HibernateValidator。这样,配置就算完成了。

例如:  在这里需要提交的数据中,假设学生编号不能为空,学生姓名长度不能超过 10 且不能为空,邮箱地址要合法,年龄不能超过 150。那么在定义实体类的时候,就可以加入这个判断条件了。

public class Student { 
    @NotNull 
    private Integer id; 
    @NotNull 
    @Size(min = 2,max = 10) 
    private String name; 
    @Email 
    private String email; 
    @Max(150) 
    private Integer age; 
 
    public String getEmail() { 
        return email; 
    } 
}

 

controller

@Controller 
public class StudentController { 
    @RequestMapping("/addstudent")
    @ResponseBody 
    public void addStudent(@Validated Student student, BindingResult result) { 
        if (result != null) { 
            //校验未通过,获取所有的异常信息并展示出来 
            List<ObjectError> allErrors = result.getAllErrors(); 
            for (ObjectError allError : allErrors) { 
                System.out.println(allError.getObjectName()+":"+allError.getDefaultMessage()); 
            } 
        } 
    } 
}

@Validated  表示 Student 中定义的校验规则将会生效
BindingResult 表示出错信息,如果这个变量不为空,表示有错误,否则校验通过。

 

2、分组校验

      由于校验规则都是定义在实体类上面的,但是,在不同的数据提交环境下,校验规则可能不一样。例如,用户的id 是自增长的,添加的时候,可以不用传递用户 id,但是修改的时候则必须传递用户 id,这种情况下,就需要使用分组校验。分组校验,首先需要定义校验组,所谓的校验组,其实就是空接口:

public interface ValidationGroup1 { 
} 
public interface ValidationGroup2 { 
}

然后,在实体类中,指定每一个校验规则所属的组:

public class Student { 
    @NotNull(message = "{student.id.notnull}", groups = ValidationGroup1.class) 
    private Integer id; 
    @NotNull(message = "{student.name.notnull}",groups = {ValidationGroup1.class, ValidationGroup2.class}) 
    @Size(min = 2,max = 10,message = "{student.name.length}",groups ={ValidationGroup1.class, ValidationGroup2.class}) 
    private String name; 
    @Email(message = "{student.email.error}",groups = {ValidationGroup1.class, ValidationGroup2.class}) 
    private String email; 
    @Max(value = 150,message = "{student.age.error}",groups = {ValidationGroup2.class}) 
    private Integer age; 
}

在 group 中指定每一个校验规则所属的组,一个规则可以属于一个组,也可以属于多个组。

Controller:

@Controller 
public class StudentController { 
    @RequestMapping("/addstudent") 
    @ResponseBody 
    public void addStudent(@Validated(ValidationGroup2.class) Student student, BindingResult result) { 
        if (result != null) { 
            //校验未通过,获取所有的异常信息并展示出来 
            List<ObjectError> allErrors = result.getAllErrors(); 
            for (ObjectError allError : allErrors) { 
                System.out.println(allError.getObjectName()+":"+allError.getDefaultMessage()); 
            } 
        } 
    } 
}

 

4、校验注解

  1. @Null 被注解的元素必须为 null
  2. @NotNull 被注解的元素必须不为 null
  3. @AssertTrue 被注解的元素必须为 true
  4. @AssertFalse 被注解的元素必须为 false
  5. @Min(value) 被注解的元素必须是一个数字,其值必须大于等于指定的最小值
  6. @Max(value) 被注解的元素必须是一个数字,其值必须小于等于指定的最大值
  7. @DecimalMin(value) 被注解的元素必须是一个数字,其值必须大于等于指定的最小值
  8. @DecimalMax(value) 被注解的元素必须是一个数字,其值必须小于等于指定的最大值
  9. @Size(max=, min=) 被注解的元素的大小必须在指定的范围内
  10. @Digits (integer, fraction) 被注解的元素必须是一个数字,其值必须在可接受的范围内
  11. @Past 被注解的元素必须是一个过去的日期
  12. @Future 被注解的元素必须是一个将来的日期
  13. @Pattern(regex=,flag=) 被注解的元素必须符合指定的正则表达式
  14. @NotBlank(message =) 验证字符串非 null,且长度必须大于0
  15. @Email 被注解的元素必须是电子邮箱地址
  16. @Length(min=,max=) 被注解的字符串的大小必须在指定的范围内
  17. @NotEmpty 被注解的字符串的必须非空
  18. @Range(min=,max=,message=) 被注解的元素必须在合适的范围内