美文网首页
SpringBoot参数验证

SpringBoot参数验证

作者: 机智小当家 | 来源:发表于2020-07-08 15:26 被阅读0次

    SpringBoot参数验证

    简介

    在web开发中,后端为了业务逻辑和数据安全性,要对获取到的进行验证,当只有少数参数时,还可以用代码很优雅的进行判断,为了避免大量参数,或者对象参数中有需要验证的属性时,我们就可以使用@Validator进行快速的进行参数验证。
    Validator是JAVA定义的一套基于注解的数据消炎规范,主要集中在SpringBoot的spring-boot-starter-web配置中,所以如果想要使用,需要在Pom.xml中添加如下配置:

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

    注解介绍

    下面介绍下SpringBoot中的参数校验的注解如(根据版本不一样,注解可能会有改变,可以通过查看javax.validation.constraints,查看有哪些注解可以使用):

    • @AssertFalse 所注解的元素必须是Boolean类型,且值为false
    • @AssertTrue 所注解的元素必须是Boolean类型,且值为true
    • @DecimalMax 所注解的元素必须是数字,且值小于等于给定的值
    • @DecimalMin 所注解的元素必须是数字,且值大于等于给定的值
    • @Digits 所注解的元素必须是数字,且值必须是指定的位数
    • @Future 所注解的元素必须是将来某个日期
    • @Max 所注解的元素必须是数字,且值小于等于给定的值
    • @Min 所注解的元素必须是数字,且值小于等于给定的值
    • @Range 所注解的元素需在指定范围区间内
    • @NotNull 适用于任何类型被注解的元素必须不能与NULL
    • @NotBlank 只能用于String上面,不能为null,且调用trim()后,长度大于0
    • @NotEmpty 适用于String、Map、数组,不能为Null且长度必须大于0
    • @Null 所注解的元素值为null
    • @Past 所注解的元素必须是某个过去的日期
    • @PastOrPresent 所注解的元素必须是过去某个或现在日期
    • @Pattern 所注解的元素必须满足给定的正则表达式
    • @Size 所注解的元素必须是String、集合或数组,且长度大小需保证在给定范围之内
    • @Email 所注解的元素需满足Email格式

    如何使用

    配置

    首先我们配置,只要有一个配置参数验证失败,即返回失败。

    @Configuration
    public class ValidatorConf {
        @Bean
        public Validator validator() {
            ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                    .configure()
                    .failFast( true ) // 设置有一个错误,立马返回
                    .buildValidatorFactory();
            Validator validator = validatorFactory.getValidator();
            return validator;
        }
    }
    

    验证异常处理

    除了设置验证配置意外,还需要对设置异常的返回格式,不然会如其他异常一样,进行控制台打印,返回给前端

    @RestControllerAdvice //全局异常处理器
    public class GlobalServiceExceptionHandler {
       
        @ExceptionHandler({BindException.class, MethodArgumentNotValidException.class})
        @ResponseBody
        public Response validationErrorHandler(HttpServletRequest req, Exception exception) throws Exception {
            List<String> message = new ArrayList<>();
            BindingResult bindingResult = null;
            if(exception instanceof BindException){
                BindException exs = (BindException) exception;
                bindingResult = exs.getBindingResult();
            }else if(exception instanceof MethodArgumentNotValidException){
                MethodArgumentNotValidException exs = (MethodArgumentNotValidException) exception;
                bindingResult = exs.getBindingResult();
            }
            // 有错误返回类型
            if(bindingResult != null){
                List<ObjectError> allErrors = bindingResult.getAllErrors();
                for (ObjectError item : allErrors) {
                    message.add(item.getDefaultMessage());
                }
            }
            return Response.fail(JSON.toJSONString(message));
        }
    }
    

    分组

    Valiadtion除了对参数本身进行验证,还支持对验证参数进行分组,比如按照请求,可以分为Create、Update、Delete、Query。
    那么在标注参数验证的时候,可以设置相关分组

    @NotBlank(message = "用户姓名不能为空", groups = Create.class)
    @NotNull(message = "用户姓名不能为空", groups = Create.class)
    private String userName;
    

    除了参数本身,还需要在入口进行分组的设置

    public Response add(@RequestBody @Validated(Create.class) ValidationAddDTO addDTO){
        return Response.ok(“添加成功”);
    }
    

    使用

    前置工作做好后,下面我们就开始在代码中真实使用相关验证了
    需要验证的对象:

    @Data // lombok
    public class ValidationQueryDTO {
        // message  验证失败,返回的消息
        @NotBlank(message = "字符串不能为空")
        private String str;
        @Min(value = 18, message = "最小18岁")
        private Integer age;
        @NotNull(message = "数值对象不能为空")
        private Long number;
    }
    

    请求入口Controller的代码示例:

    @Validated // 在Controller类上设置,必须
    @RestController
    @RequestMapping("/validation")
    public class ValidationController {
        // 如果需要验证Post请求对象,必须同时存在@RequestBody @Validated
        @PostMapping(value = "/object")
        public Response validationObject(@RequestBody @Validated ValidationQueryDTO queryDTO){
            return Response.ok(“参数正确”);
        }
       // 单个参数验证
       @PostMapping("/get")
       public ReturnVO getInfo(@RequestParam("userId") @NotNull(message = "用户ID不能为空") String userId){
             return Response.ok();
       }
       // 验证邮箱
       public ReturnVO getEmail(@RequestParam("email") @Size(max = 32, min = 6, message = "长度需要在6-32之间") @Email String email)
           return Response.ok();
       }
    }
    

    相关文章

      网友评论

          本文标题:SpringBoot参数验证

          本文链接:https://www.haomeiwen.com/subject/oojccktx.html