zoukankan      html  css  js  c++  java
  • Spring Boot 进行优雅的字段校验,写得太好了!

    作者:何甜甜在吗
    来源:juejin.cn/post/6913735652806754311

    前段时间提交代码审核,同事提了一个代码规范缺陷:参数校验应该放在controller层。到底应该如何做参数校验呢

    Controller层 VS Service层

    去网上查阅了一些资料,一般推荐与业务无关的放在Controller层中进行校验,而与业务有关的放在Service层中进行校验。

    那么如何将参数校验写的优雅美观呢,如果都是if - else,就感觉代码写的很low,还好有轮子可以使用

    常用校验工具类

    使用Hibernate Validate

    引入依赖

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>4.3.1.Final</version> 
    </dependency>
    

    常用注解说明

    使用姿势

    Spring Boot 基础就不介绍了,推荐下这个实战教程:
    https://www.javastack.cn/categories/Spring-Boot/

    需要搭配在Controller中搭配@Validated或@Valid注解一起使用,@Validated和@Valid注解区别不是很大,一般情况下任选一个即可,区别如下:

    虽然@Validated比@Valid更加强大,在@Valid之上提供了分组功能和验证排序功能,不过在实际项目中一直没有用到过

    Hibernate-validate框架中的注解是需要加在实体中一起使用的

    • 定义一个实体
    public class DataSetSaveVO {
        //唯一标识符为空
        @NotBlank(message = "user uuid is empty")
        //用户名称只能是字母和数字
        @Pattern(regexp = "^[a-z0-9]+$", message = "user names can only be alphabetic and numeric")
        @Length(max = 48, message = "user uuid length over 48 byte")
        private String userUuid;
    
        //数据集名称只能是字母和数字
        @Pattern(regexp = "^[A-Za-z0-9]+$", message = "data set names can only be letters and Numbers")
        //文件名称过长
        @Length(max = 48, message = "file name too long")
        //文件名称为空
        @NotBlank(message = "file name is empty")
        private String name;
    
        //数据集描述最多为256字节
        @Length(max = 256, message = "data set description length over 256 byte")
        //数据集描述为空
        @NotBlank(message = "data set description is null")
        private String description;
    }
    

    说明:message字段为不符合校验规则时抛出的异常信息

    • Controller层中的方法
    @PostMapping
    public ResponseVO createDataSet(@Valid @RequestBody DataSetSaveVO dataSetVO) {
        return ResponseUtil.success(dataSetService.saveDataSet(dataSetVO));
    }
    

    说明:在校验的实体DataSetSaveVO旁边添加@Valid或@Validated注解

    使用commons-lang3

    引入依赖

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.4</version>
    </dependency>
    

    常用方法说明

    测试代码

    //StringUtils.isEmpty
    System.out.println(StringUtils.isEmpty(""));  //true
    System.out.println(StringUtils.isEmpty("  "));  //false
    //StringUtils.isNotEmpty
    System.out.println(StringUtils.isNotEmpty(""));  //false
            
    //StringUtils.isBlank
    System.out.println(StringUtils.isBlank(""));  //true
    System.out.println(StringUtils.isBlank(" "));  //true
    //StringUtils.isNotBlank
    System.out.println(StringUtils.isNotBlank(" "));  //false
    
    List<Integer> emptyList = new ArrayList<>();
    List<Integer> nullList = null;
    List<Integer> notEmptyList = new ArrayList<>();
    notEmptyList.add(1);
    
    //CollectionUtils.isEmpty
    System.out.println(CollectionUtils.isEmpty(emptyList));   //true
    System.out.println(CollectionUtils.isEmpty(nullList));   //true
    System.out.println(CollectionUtils.isEmpty(notEmptyList));   //false
    
    //CollectionUtils.isNotEmpty
    System.out.println(CollectionUtils.isNotEmpty(emptyList));   //false
    System.out.println(CollectionUtils.isNotEmpty(nullList));   //false
    System.out.println(CollectionUtils.isNotEmpty(notEmptyList));   //true
    

    自定义注解

    当上面的方面都无法满足校验的需求以后,可以考虑使用自定义注解。

    近期热文推荐:

    1.1,000+ 道 Java面试题及答案整理(2021最新版)

    2.别在再满屏的 if/ else 了,试试策略模式,真香!!

    3.卧槽!Java 中的 xx ≠ null 是什么新语法?

    4.Spring Boot 2.5 重磅发布,黑暗模式太炸了!

    5.《Java开发手册(嵩山版)》最新发布,速速下载!

    觉得不错,别忘了随手点赞+转发哦!

  • 相关阅读:
    输入一个字符串,输出该字符串中字符的所有组合 C#【总结】
    Asp.net的身份验证【转载】
    C#面试基础问题【转载】
    Testing and Checking Refined
    Exploratory Testing 3.0 探索式测试
    博客搬家
    Seven Kinds of Testers - 七种类型的测试
    使用Spring的Property文件存储测试数据 - 初始化
    Protractor 怎样运行
    Protractor-引入Cucumber
  • 原文地址:https://www.cnblogs.com/javastack/p/15475153.html
Copyright © 2011-2022 走看看