validation的使用和全局异常处理器

自我理解:

validation 的使用可以让我们减少代码的书写 就是在代码里进行一些简单的逻辑判断 

判空 长 等 也可以自定义注解进行数据判定 

但是判断后返回的数据以异常形式抛出 是抛出到控制器 但是我们需要让这些数据返回到前端  那么就需要声明一个全局异常处理器 进行拦截这些异常进行处理  然后通过异常处理器 返回数据到 前端 

validation:使用

1;导依赖:

   <!--validation-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

2:使用

实体类:

在属性上加上validation的注解进行判断属性 需要在使用判断的地方声明

@Valid 注解
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
 public class LoginVo {
     @NotNull(message = "手机号为空")//不能为空
     @IsMobile //自定义的注解 判断手机号格式
     private String mobile;
     @NotNull
     @Length(min = 32)  //长度最骚为 32位
     private String password;
     
 }

 controller:

    /*** 登录 * @return */
    @RequestMapping("/doLogin")
    @ResponseBody
             //@Valid 是声明该属性使用validation进行校验
    public RespBean doLogin(@Valid LoginVo loginVo) {
        log.info(loginVo.toString());
        return userService.login(loginVo);
    }
}

 3:自定义注解:

从其他的判断注解copy模板 

自己需要设置配置类 自定义返回的报错消息 等等 

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
   //设置配置类 即 该注解怎末进行判断
@Constraint(
        validatedBy = {IsMobileValidator.class}
)
public @interface IsMobile {
    boolean required() default true; //设置为必填

    String message() default "{手机号格式错误}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

注解的配置:

/*
* 手机号校验规则 注解校验手机号的配置类          
* */
//                     必须继承这个接口 然后参数为 作为那个注解的配置 和处理的数据类型
public class IsMobileValidator implements ConstraintValidator<IsMobile,String> {
    private  boolean required=true;

    @Override
    public void initialize(IsMobile constraintAnnotation) {
        //判断是否为必填项
         required = constraintAnnotation.required();
    }

    @Override     //       接受传来的参数
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        if (required){
            //为必填 代表肯定有数据直接用工具类判断直接判断
            return ValidatorUtil.isMobile(s);
        }else {
            //不为必填
            if (s.isEmpty()){
                //为空返回false
                return false;
            }else {
                //不为空 进行用工具类判断
               return ValidatorUtil.isMobile(s);
            }
        }
    }
}

 定义的工具类

/*** 校验工具类 ** @author zhoubin * @since 1.0.0 */
public class ValidatorUtil {
     //定义一个正则表达式
    private static final Pattern mobile_pattern = Pattern.compile("[1]([3-9])[0-9]{9}$");
     //定义一个方法判断
    public static boolean isMobile(String mobile){
        //判断参数是否为空
        if (StringUtils.isEmpty(mobile)) {
            return false;
        }
        //判断参数是否和正则表达式匹配
        Matcher matcher = mobile_pattern.matcher(mobile);
        //返回匹配的结果
        return matcher.matches(); 
    }
}

 全局异常处理器:

//声明为异常处理器
@RestControllerAdvice
public class GlobalExceptionHandler {
    //进行具体异常分类处理

        //拦截所以异常进行抓取 处理
    @ExceptionHandler(Exception.class)
    public RespBean exceptionHandle(Exception exception){
       //判断异常类型
        if (exception instanceof GlobalException){
            //拦截的是自定义的异常
            GlobalException globalException= (GlobalException) exception;
            // 参数为 全局异常的枚举
            return RespBean.error(globalException.getRespBeanEnum());

        }else if (exception instanceof BindException){

            //拦截的是validator绑定的异常

            BindException bindException= (BindException) exception;
          //定义返回为绑定错误
            RespBean respBean = RespBean.error(RespBeanEnum.BIND_ERROR);
            //设置数据为绑定消息
            respBean.setMessage(
                    RespBeanEnum.BIND_ERROR.getMessage()
                   +":::"+bindException.getBindingResult()
                    .getAllErrors()
                    .get(0)
                    .getDefaultMessage()
            );
            return respBean;

        }
        //不属于那两个异常 就返回这
        return RespBean.error(RespBeanEnum.ERROR);
    }


}

自定义的异常:

/*
* 自定义的异常 定义一个枚举属性
* */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GlobalException extends RuntimeException {
    private RespBeanEnum respBeanEnum;
}

 

注解作用
@Valid被注释的元素是一个对象,需要检查此对象的所有字段值
@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(value)被注释的元素必须符合指定的正则表达式

Hibernate Validator 附加的 constraint

注解作用
@Email被注释的元素必须是电子邮箱地址
@Length(min=, max=)被注释的字符串的大小必须在指定的范围内
@NotEmpty被注释的字符串的必须非空
@Range(min=, max=)被注释的元素必须在合适的范围内
@NotBlank被注释的字符串的必须非空
@URL(protocol=,host=, port=,regexp=, flags=)被注释的字符串必须是一个有效的url

官方详细

中文详细

容易记错的

@NotNull 任何对象的value不能为null

@NotEmpty 集合对象的元素不为0,即集合不为空,也可以用于字符串不为null

@NotBlank 只能用于字符串不为null,并且字符串trim()以后length要大于0


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值