Hibernate Validator

文章目录

      • 1、简介
      • 2、快速入门
        • 2.1 引入依赖:
        • 2.2 新建实体类,并添加注解
        • 2.3 编写controller层,进行测试;
        • 2.4 全局异常捕获
      • 3、hibernate的两种校验方式

1、简介

常见注解:

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

2、快速入门

2.1 引入依赖:


    org.hibernate
    hibernate-validator
    6.1.0.Final

2.2 新建实体类,并添加注解

@Data
@AllArgsConstructor
@NoArgsConstructor
public class SimpleUser implements Serializable {

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

    @NotBlank(message = "用户名不能为空")
    private String name;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {

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

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

    @Size(min = 6, max = 8, message = "密码必须是6-8位")
    @NotNull(message = "密码不能为空")
    private String password;

    @Min(0)
    @Max(200)
    private Integer age;

    @Email(message = "邮箱格式不正确")
    @NotBlank(message = "邮箱不能为空")
    private String email;

    @NotNull(message = "列表不能为空")
    private List<String> list;


    @DecimalMin("0.0")
    @DecimalMax("100.0")
    @NotNull(message = "工资不能为空")
    private Double salary;

    @Valid  //递归校验,如果是个对象,可以检验对象里的内容
    @NotNull(message = "账户不能为空")
    private Count count;

}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Count implements Serializable {

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

    @NotBlank(message = "账户名不能为空")
    private String countName;

    @DecimalMin("0.0")
    @DecimalMax("100.0")
    private Double price;
}

2.3 编写controller层,进行测试;

@RestController
@Validated
public class TestController {
	//BindingResult捕获错误
    /**
     * Get请求,检验简单对象
     * @param user
     * @param result
     * @return
     */
    @GetMapping("/test1")
    public String test1(@Valid SimpleUser user, BindingResult result){
        if(result.hasErrors()){
            result.getAllErrors().forEach(objectError -> {
                System.out.println(objectError.getDefaultMessage());
            });
            return "error";
        }
        return "test1......";
    }


    /**
     * Post请求检验json串
     * @param user
     * @return
     */
    @PostMapping("/test2")
    public String test2(@RequestBody @Valid User user, BindingResult result){
        System.out.println(user);
        if(result.hasErrors()){
            result.getAllErrors().forEach(objectError -> {
                System.out.println(objectError.getDefaultMessage());
            });
            return "error2";
        }
        return "test2......";
    }

    /**
     * 使用@RequestParam方式,@Valid无效,需要在Controller上加@Validated注解
     * @param id
     * @param name
     * @param age
     * @return
     */
    @GetMapping("/test3")
    public String test3(@RequestParam("id")Long id,
                        @RequestParam(value = "name",required = false)String name,
                        @Min(0) @Max (100) @RequestParam(value = "age",required = false)Integer age){
        System.out.println(id);
        System.out.println(name);
        System.out.println(age);
        return "test3......";
    }


    /**
     * 通过全局异常捕获错误
     * @param user
     * @param
     * @return
     */
    @PostMapping("/test4")
    public String test4(@RequestBody @Valid User user){
        return "test4......";
    }
}

2.4 全局异常捕获

/**
 * 全局异常对参数校验异常进行捕获
 */
@RestControllerAdvice
public class GlobalException {
	
    //可以返回ResponseModel,这只是测试返回字符串,到时可以自行封装
    //ValidationException,顶层异常,可以进行捕获,ConstraintViolationException是子异常
    @ExceptionHandler(ConstraintViolationException.class)
    public String validationErrorHandler(ConstraintViolationException  ce){
        for (ConstraintViolation<?> violation : ce.getConstraintViolations()) {
            String errorMsg = violation.getMessage();
            System.out.println(errorMsg);   //打印错误信息
        }
        return "globalException";
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public String validateHandler(MethodArgumentNotValidException e){
        BindingResult bindingResult = e.getBindingResult();
        for (ObjectError error : bindingResult.getAllErrors()) {
            System.out.println(error.getDefaultMessage());  //打印错误信息
        }
        return "error..." ;
    }
}

3、hibernate的两种校验方式

3.1 普通模式,会获取所有校验错误信息

/**
 * hibernate validator的配置类
 */
@Configuration
public class ValidatorConfiguration {   
	@Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
      /**默认是普通模式,会返回所有的验证不通过信息集合*/
        return new MethodValidationPostProcessor();
    }
}

3.2 快速失败模式,只要出现检验错误就立即返回(企业级)

/**
 * hibernate validator的配置类
 */
@Configuration
public class ValidatorConfiguration {

    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
        /**设置validator模式为快速失败返回*/
        postProcessor.setValidator(validator());
        return postProcessor;
    }

    @Bean
    public Validator validator(){
        //false:则关闭,true:开启快速失败
        ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
                .configure()
                .addProperty( "hibernate.validator.fail_fast", "true" )	
                .buildValidatorFactory();
        Validator validator = validatorFactory.getValidator();

        return validator;
    }
}

你可能感兴趣的:(spring,hibernate,python,java)