Hibernate Validator校验

小编:管理员 367阅读 2022.09.14

1. 参数校验
  • 官网地址
  • spring-boot-starter-web包里面有hibernate-validator包,不需要引用hibernate validator依赖。
2. hibernate validator校验demo
1. 导入包
import org.hibernate.validator.constraints.NotBlank;

import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.Pattern;
复制2. demo
@Getter
@Setter
@NoArgsConstructor
public class DemoModel {
    @NotBlank(message="用户名不能为空")
    private String userName;

    @NotBlank(message="年龄不能为空")
    @Pattern(regexp="^[0-9]{1,2}$",message="年龄不正确")
    private String age;

    @AssertFalse(message = "必须为false")
    private Boolean isFalse;
    /**
     * 如果是空,则不校验,如果不为空,则校验
     */
    @Pattern(regexp="^[0-9]{4}-[0-9]{2}-[0-9]{2}$",message="出生日期格式不正确")
    private String birthday;
}
复制3. 结果返回
@RequestMapping("/demo2")
public void demo2(@RequestBody @Valid DemoModel demo, BindingResult result){
    if(result.hasErrors()){
        for (ObjectError error : result.getAllErrors()) {
            System.out.println(error.getDefaultMessage());
        }
    }
}
复制4. 传入参数
{"userName":"dd","age":120,"isFalse":true,"birthday":"21010-21-12"}
复制5. 输出结果
出生日期格式不正确
必须为false
年龄不正确
复制3. hibernate的校验模式
1. 普通模式(默认为该模式)
  • 会校验所有属性,然后返回所有的验证失败信息。
2. 快速失败返回模式
  • 只要有一个校验失败则返回。
3. 设置方式
// failFast: true 快速失败返回模式,false 普通模式
ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
        .configure()
        .failFast( true )
        .buildValidatorFactory();
Validator validator = validatorFactory.getValidator();
复制
// hibernate.validator.fail_fast: true 快速失败返回模式,false 普通模式
ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
        .configure()
        .addProperty( "hibernate.validator.fail_fast", "true" )
        .buildValidatorFactory();
Validator validator = validatorFactory.getValidator();
复制4. hibernate的校验
1. 请求参数校验
  • 验证请求参数时,在 @RequestBody DemoModel demo 之间加注解 @Valid,然后在后面加 BindindResult 即可;多个参数,可以添加多个 @Valid 和 BindindResult。
public void test()(@RequestBody @Valid DemoModel demo, BindingResult result)
public void test()(@RequestBody @Valid DemoModel demo, BindingResult result,@RequestBody @Valid DemoModel demo2, BindingResult result2)
复制
@RequestMapping("/demo2")
public void demo2(@RequestBody @Valid DemoModel demo, BindingResult result){
    if(result.hasErrors()){
        for (ObjectError error : result.getAllErrors()) {
            System.out.println(error.getDefaultMessage());
        }
    }
}
复制2. GET参数校验(@RequestParam参数校验)3. model校验4. 对象级联校验
  • 对象内部包含另一个对象作为属性,属性上加 @Valid,可以验证作为属性的对象内部的验证
5. 分组校验5. 自定义校验器
1. 大小写校验器
public enum CaseMode {
    UPPER,
    LOWER;
}


@Target( { ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = CheckCaseValidator.class)
@Documented
public @interface CheckCase {
    String message() default "";

    Class[] groups() default {};

    Class[] payload() default {};

    CaseMode value();
}


public class CheckCaseValidator implements ConstraintValidator {
    private CaseMode caseMode;
    public void initialize(CheckCase checkCase) {
        this.caseMode = checkCase.value();
    }

    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        if (s == null) {
            return true;
        }

        if (caseMode == CaseMode.UPPER) {
            return s.equals(s.toUpperCase());
        } else {
            return s.equals(s.toLowerCase());
        }
    }
}
复制2. Demo
public class Demo{
    @CheckCase(value = CaseMode.LOWER,message = "userName必须是小写")
    private String userName;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}
复制3. Validator配置
@Bean
public Validator validator(){
    ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
            .configure()
            .addProperty( "hibernate.validator.fail_fast", "true" )
            .buildValidatorFactory();
    Validator validator = validatorFactory.getValidator();

    return validator;
}
复制4. 校验测试
@RequestMapping("/demo4")
public void demo4(){
    Demo demo = new Demo();
    demo.setUserName("userName");
    Set> validate = validator.validate(demo);
    for (ConstraintViolation dem : validate) {
        System.out.println(dem.getMessage());
    }
}
复制6. 常见的注解

No.

注解

解释

01

@Null

检查该字段为空

02

@NotNull

不能为 null

03

@NotBlank

不能为空,检查时会将空格忽略

04

@NotEmpty

不能为空,这里的空是指空字符串

05

@AssertTrue

用于boolwan字段,只能为true

06

@AssertFalse

用于boolwan字段,只能为false

07

@CreditCardNumber

对信用卡进行一个大致的校验

08

@DecimalMin(value)

数值类型,只能小于或等于value

09

@DecimalMax(value)

数值类型,只能大于或等于value

10

@Digits(integer=2,fraction=20)

限制必须为一个小数,整数部分位数不能超过integer,小数部分位数不能超过fraction

11

@Email

检查是否是一个有效的email地址

12

@Past

检查该字段的日期是否属于过去的日期

13

@Future

检查该字段的日期是否属于将来的日期

14

@Length(min=,max=)

检查该字段的长度是否在min和max之间,只能用于字符串

15

@Size(min=,max=)

检查该字段的size是否在min和max之间,可以是字符串、数组、集合、map等

16

@Min(value)

小于等于value

17

@Max(value)

大于等于value

18

@URL(protocol=,host,port) 检查是否是一个有效的URL,如果提供来protocol,host等,则该url还需满足提供的条件

19

@Valid

该注解只要用于字段为一个包含其他对象的集合或map或数组的字段,或该字段直接为一个其他对象的引用(这样在检查当前对象的同时也会检查该字段所引用的对象)

关联标签: