zoukankan      html  css  js  c++  java
  • 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

    自定义注解

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

  • 相关阅读:
    Shodan在渗透测试及漏洞挖掘中的一些用法
    QUdpSocket 简单用法
    用QT操作数据库(本周学的)
    Qt使用UDp通信、套接字socket的成员函数bind()的作用
    ppm的含义
    数字的补数
    两数之和
    C++中的最大整数最小整数
    如何使用dockerfile将jar包生成镜像
    python3解决 json.dumps中文乱码
  • 原文地址:https://www.cnblogs.com/fengyun2050/p/15491799.html
Copyright © 2011-2022 走看看