Hibernate-invalidator的使用

1、为什么要学习Hibernate-invalidator框架

在这里插入图片描述

在这里插入图片描述

在上述的情况下、Hibernate-invalidator就应运而生了

备注:Hibernate-invalidator这个框架跟 Hibernate并没有什么关系、是一个独立的框架

2、对象参数的校验

2.1、定义对象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    @NotNull(message = "用户名不能为空")
    @Length(min = 6,max = 10,message = "用户名长度不对")
    private String userName;
    @NotNull(message = "密码不能为空")
    @Length(min = 6,max = 10,message = "密码的长度不对")
    private String password;
}
2.2、定义controller
 @RequestMapping("register")
    public String  register(@Valid User user, BindingResult result){
      if(result.hasFieldErrors()){  //如果校验有错那么这里就返回的是true
          //获取所有的校验错误的信息
          List<FieldError> fieldErrors = result.getFieldErrors();
          for (FieldError f:fieldErrors) {
                //这里就可以知道是那个校验出错了
              String fieldName = f.getField();    //校验出错的key的名字
              String message = f.getDefaultMessage();
              logger.info("校验出错的列是:"+fieldName+"----校验的提示信息是:"+message);
          }
      }
      return "请求完成....";
    }
正则事例
var reg=/^1[3,4,5,6,7,8][0-9]{9}$/
String reg1="1[3,4,5,6,7,8][0-9]{9}";

3、方法参数的校验

3.1、写配置文件支持单个参数的校验
 /**
     * 开启Hiberante-invalidator对方法单个参数校验的支持
     * @return
     */
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor(){
        return new MethodValidationPostProcessor();
    }
3.2、在校验的类上添加如下的注解
@Validated  
3.3、编写要校验的方法
 /**
     * 做单个数据的校验
     * @param userName
     * @param password
     * @return
     */
    @RequestMapping(value = "register1")
    public String  register1(@NotNull(message = "用户名不能为空") @Length(min = 6,max = 10,message = "用户名只能6-10位之间") @RequestParam("userName") String userName,
                             @NotNull(message = "密码不能为空") @Length(min = 6,max = 10,message = "密码只能6-10位之间") @RequestParam("password") String password){

      return "请求完成....";
    }

4、Hibernate-invalidator的校验模式

4.1、校验模式的问题
4.1.1、普通模式的校验

就是所有的字段都要校验、而且校验不通过的 都要返回这个校验错误的信息

4.1.2、快速校验模式

只要校验中一个没通过、后面的就不用校验了

下面就是配置校验模式

配置文件中

 /**
     * 配置校验的规则 是普通校验呢还是快速校验
     * @return
     */
    @Bean
    public Validator validator(){
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure()
                .addProperty("Hibernate.validator.fail_fast", "true")  //true:表示的快速校验    false:普通的校验
                .buildValidatorFactory();
        return validatorFactory.getValidator();
    }

5、分组校验(*)

5.1、创建分组(就空接口而已)
public interface Login {
}

public interface Register {
}
5.2、在方法上表明当前这个方法属于哪一个组
 @RequestMapping("register")
    public String  register(@Validated(Register.class) User user, BindingResult result){
      if(result.hasFieldErrors()){  //如果校验有错那么这里就返回的是true
          //获取所有的校验错误的信息
          List<FieldError> fieldErrors = result.getFieldErrors();
          for (FieldError f:fieldErrors) {
                //这里就可以知道是那个校验出错了
              String fieldName = f.getField();    //校验出错的key的名字
              String message = f.getDefaultMessage();
              logger.info("校验出错的列是:"+fieldName+"----校验的提示信息是:"+message);
          }
      }

      return "请求完成....";
    }

    /**
     * 登陆这个方法
     * @param user
     * @param result
     * @return
     */
    @RequestMapping("login")
    public String  login(@Validated(Login.class) User user, BindingResult result){
      if(result.hasFieldErrors()){  //如果校验有错那么这里就返回的是true
          //获取所有的校验错误的信息
          List<FieldError> fieldErrors = result.getFieldErrors();
          for (FieldError f:fieldErrors) {
                //这里就可以知道是那个校验出错了
              String fieldName = f.getField();    //校验出错的key的名字
              String message = f.getDefaultMessage();
              logger.info("校验出错的列是:"+fieldName+"----校验的提示信息是:"+message);
          }
      }

      return "请求完成....";
    }
5.3、在对象上标明当前属性需要在哪些分组做校验
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    @NotNull(message = "用户名不能为空",groups = {Register.class, Login.class})
    @Length(min = 6,max = 10,message = "用户名长度不对",groups = {Register.class, Login.class})
    private String userName;
    @NotNull(message = "密码不能为空",groups = {Register.class, Login.class})
    @Length(min = 6,max = 10,message = "密码的长度不对",groups = {Register.class, Login.class})
    private String password;
    @NotNull(message = "密码不能为空",groups = {Register.class})
    @Email(message = "不是邮箱地址",groups = {Register.class})
    private String email;    //邮箱
}

6、常见的注解

@Null 元素必须为null
@NotNull 元素不能为null
@AssertTrue 元素的值必须为true
@Assertfalse 元素必须为false
@Min | @DecimalMin :元素的值必须是一个数字  这个数字 的值必须大于等于最小值
@Max | @DecimalMax : 元素的值必须是一个数字  这个数字 的值必须小于等于最大值
@Size :表示的是元素的大小在指定的范围内
@Past :表示的是元素的值 必须是一个过期的时间
@Future:表示的是元素的值 必须在一个将来的时间
@Pattern(rex=xxx) :正则表达式判断的
@Notblack 字符串非null 长度必须大于0
@Email :邮箱判断
@length :长度判断
@NotEmpty :字符串非空
@Range :表示的是元素必须在指定的范围内

希望大家关注我一波,防止以后迷路,有需要的可以加我Q讨论互相学习java ,学习路线探讨,经验分享与java Q:2415773436

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值