jsr303参数校验

JSR303 参数校验
基本实现
  • 前提springboot项目

  • 引入依赖

    <!--jsr303校验-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-validation</artifactId>
            </dependency>
    
  • 类参数加注解

    @Data
    public class PlanVo {
        private Integer id;
        @NotBlank(message = "计划名不可为空")
        private String planName;
        @NotBlank(message = "计划类型不可为空")
        private String planType;
    }
    
  • Controller中使用 @Valid

    • BindingResult 封装了参数校验的信息
    @PostMapping("/test")
        public Map test(@Valid @RequestBody PlanVo planVo, BindingResult result){
            Map<String, Object> map = new HashMap<>();
            if (result.hasErrors()){
                result.getFieldErrors().forEach(err->{
                    map.put(err.getField(), err.getDefaultMessage());
                });
            }
            return map;
        }
    
  • 效果

在这里插入图片描述

使用统一异常处理(推荐)
  • 参数校验不通过时,会抛出 BingBindException 异常,可以在统一异常处理中,做统一处理,这样就不用在每个需要参数校验的地方都用 BindingResult 获取校验结果了

    //@RestControllerAdvice(basePackages = "com.wen.boot01.controller")
    @RestControllerAdvice(basePackageClasses = {com.wen.boot01.controller.PlanController.class})
    public class PlanExceptionControllerAdvice {
        //拦截用@Valid注释的参数的验证失败时抛出的异常
        @ExceptionHandler(value = {MethodArgumentNotValidException.class, BindException.class})
        public Map<String, Object> handleValidException(Exception e){
            BindingResult bindingResult = null;
            Map<String, Object> map = new HashMap<>();
            if (e instanceof MethodArgumentNotValidException){
                bindingResult = ((MethodArgumentNotValidException) e).getBindingResult();
                bindingResult.getFieldErrors().forEach(fieldError -> {
                    map.put(fieldError.getField(), fieldError.getDefaultMessage());
                });
            }else if (e instanceof BindException){
                bindingResult = ((BindException) e).getBindingResult();
                bindingResult.getFieldErrors().forEach(fieldError -> {
                    map.put(fieldError.getField(), fieldError.getDefaultMessage());
                });
            }
            return map;
        }
    }
    
  • 使用效果

    @PostMapping("/test2")
        public void test2(@Valid @RequestBody PlanVo planVo){
            
        }
    

在这里插入图片描述

分组校验
  • 当参数比如id 新增的时候可以为空,修改的时候必须传值,就可以使用分组校验

  • 使用@Validated

  • 使用方式

  • 自定义AddGroup,UpdateGroup接口

  • public interface AddGroup {
    }
    public interface UpdateGroup {
    }
    
  • @Data
    public class PlanVo {
        @Null(message = "新增可以为空",groups = AddGroup.class)
        @NotNull(message = "修改不可为空",groups = UpdateGroup.class)
        private Integer id;
        @NotBlank(message = "计划名不可为空",groups = {AddGroup.class,UpdateGroup.class})
        private String planName;
        @NotBlank(message = "计划类型不可为空",groups = {AddGroup.class,UpdateGroup.class})
        private String planType;
    }
    
  • @PostMapping("/test2")
       public void test2(@Validated(AddGroup.class) @RequestBody PlanVo planVo){
      
       }
    
jsr303 注解校验规则
注解说明
@Null被注释的元素必须为 null
@NotNull被注释的元素必须不为 null
@NotBlank此注解只能作用在接收的String类型上,不能为null,而且调用trim()后,长度必须大于0
@NotEmpty不能为null,而且长度必须大于0(" “,” "),一般用在集合类上面
@AssertTrue被注释的元素必须为 true
@AssertFalse被注释的元素必须为 false
@Min(value)验证 Number 和 String 对象是否大等于指定的值
@Max(value)验证 Number 和 String 对象是否小等于指定的值
@DecimalMin(value)被标注的值必须大等于指定的值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMax(value)被标注的值必须小等于指定的值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Size(min, max)验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min, max)验证字符串长度是否在给定的范围之内
@Pattern(value)被注释的元素必须符合指定的正则表达式

详细: https://www.cnblogs.com/rocky-AGE-24/p/5245022.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值