SpringBoot validator校验 及分组校验

 相信只要是写过项目,或者说是自己写一些练手的小系统的都写过表单校验。之前我自己在练手系统中,写表单校验通常都是在前端进行一些正则校验或者是其他的可行性校验,比如是否为空,手机号,身份证号之类的。但是这样并不完全安全,因为也可以通过模拟前台请求等工具来直接提交到后台,比如postman这样的工具,那么遇到这样的问题怎么办呢,我们可以在后台也做相应的校验。

在StringBoot开发POST接口使用HibernateValidator校验@RequestBody注解的参数时,需要对参数进行校验。使用快速失败返回模式(只要有一个验证失败,则返回)。需要控制校验字段的顺序。


1、准备

首先导入jar包,因为我用的是maven项目所以直接使用pom.xml引入jar包。需要引入的jar包如下:


        
            org.springframework.boot
            spring-boot-starter-web
        
        
            io.springfox
            springfox-swagger2
            2.9.2
        
        
            io.springfox
            springfox-swagger-ui
            2.9.2
        

然后需要相应的配置类

@Configuration
public class HibernateValidationConfig {

    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        /**默认是普通模式,会返回所有的验证不通过信息集合*/
        MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
        /**设置validator模式为快速失败返回*/
        processor.setValidator(validator());
        return processor;
    }

    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure()
                .failFast(true)
                .buildValidatorFactory();
        Validator validator = validatorFactory.getValidator();
        return validator;
    }

}

配置完成就可以使用validator校验了。

2、常见的校验注解

JSR提供的校验注解:

@Null   被注释的元素必须为 null    
@NotNull    被注释的元素必须不为 null    
@AssertTrue     被注释的元素必须为 true    
@AssertFalse    被注释的元素必须为 false    
@Min(value)     被注释的元素必须是一个数字,其值必须大于等于指定的最小值    
@Max(value)     被注释的元素必须是一个数字,其值必须小于等于指定的最大值    
@DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值    
@DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值    
@Size(max=, min=)   被注释的元素的大小必须在指定的范围内    
@Digits (integer, fraction)     被注释的元素必须是一个数字,其值必须在可接受的范围内    
@Past   被注释的元素必须是一个过去的日期    
@Future     被注释的元素必须是一个将来的日期    
@Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式

Hibernate Validator提供的校验注解:

@NotBlank(message =)   验证字符串非null,且长度必须大于0    
@Email  被注释的元素必须是电子邮箱地址    
@Length(min=,max=)  被注释的字符串的大小必须在指定的范围内    
@NotEmpty   被注释的字符串的必须非空    
@Range(min=,max=,message=)  被注释的元素必须在合适的范围内

3、使用

   @NotNull @NotBlank @NotEmpty的区别

     例如我们新建一个User实体类,其中有id,name,password,hobby属性,并且不为空。

public class User {

    @NotNull(message = "id不能为空")
    private String id;

    @NotBlank(message = "name不能为空")
    private String name;

    @NotEmpty(message = "password不能为空")
    private String password;

    @NotEmpty(message = "爱好不能为空")
    private List hobby;
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public List getHobby() {
        return hobby;
    }

    public void setHobby(List hobby) {
        this.hobby = hobby;
    }
}

经过Swagger测试,我们可以发现这四个参数都不可以为Null。但是不同的是id可以传”“,而name,password和hobby不能为”“。name不可传纯空格,但是password可以为纯空格。hobby为List集合,传参时,长度不能为零。通过这个小例子可以发现,三个注解的不同之处。

  • @NotNull:对象不能为null,一般使用在基本数据类型的验证上。
  • @NotBlank:对象不能为空,只能用来验证字符串类型。且会约束字符串长度是不能为零,并且不能为纯空格。
  • @NotEmpty:对象不能为空,可用来约束字符串长度不能为零,不识别纯空格情况。主要用来约束集合长度不为零。

不为空的校验还是比较常见的,其他的一些检验注解用法与这三个注解用法相同,具体效果和限制,可以慢慢摸索着使用,这里就不一一讲解了。

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(问题,spring,boot)