zoukankan      html  css  js  c++  java
  • Springboot中如何优雅的进行字段校验

    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>

    常用注解说明

    注解说明
    @Length(min=,max=) 检查所属的字段的长度是否在min和max之间,只能用于字符串
    @Range(min=,max=,message=) 被注释的元素必须在合适的范围内
    @Max 该字段的值只能小于或等于该值
    @Min 该字段的值只能大于或等于该值
    @NotNull 不能为null
    @NotBlank 不能为空,检查时会将空格忽略
    @NotEmpty 不能为空,这里的空是指空字符串
    @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式

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

    注解@Validated@Valid
    所属的包 属于org.springframework.validation.annotation包下的,是spring提供的 属于javax.validation包下,是jdk给提供的
    是否支持分组和排序

    虽然@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注解

    https://mp.weixin.qq.com/s/JJNKBF53YwpL8GxZmlwHCA

    故乡明
  • 相关阅读:
    win10+anaconda+cuda配置dlib,使用GPU对dlib的深度学习算法进行加速(以人脸检测为例)
    Windows下的Anaconda+OpenCV的环境配置
    视频检测人脸添加帽子完美方案
    OpenCV学习C++接口 Mat像素遍历详解
    [hadoop读书笔记] 第一章 初识 Hadoop
    [hadoop读书笔记]前言
    [hadoop读书笔记]译者序
    [Docker] Docker简介
    [sqoop1.99.6] 基于1.99.6版本的一个小例子
    [sqoop1.99.7] sqoop实例——数据ETL
  • 原文地址:https://www.cnblogs.com/luweiweicode/p/15048808.html
Copyright © 2011-2022 走看看