• Spring Boot 进行优雅的字段校验


    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>

    常用注解说明

    使用方式

    需要搭配在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

    自定义注解

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

  • 相关阅读:
    PAT 甲级 1015 Reversible Primes (20 分) (进制转换和素数判断(错因为忘了=))
    『Spring.NET+NHibernate+泛型』框架搭建之DAO(三)★
    (C#)使用队列(Queue)解决简单的并发问题
    VB.NET多线程入门
    Machine Learning With Spark学习笔记(在10万电影数据上训练、使用推荐模型)
    JAVA 并发编程-多个线程之间共享数据(六)
    POJ 3087 Shuffle&#39;m Up(模拟)
    cocos2dx --- 富文本的使用 RichText
    &lt;LeetCode OJ&gt; 217./219. Contains Duplicate (I / II)
    java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
  • 原文地址:https://www.cnblogs.com/fengyun2050/p/15491799.html
Copyright © 2020-2023  润新知