前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Springboot中优雅进行字段校验

Springboot中优雅进行字段校验

作者头像
dys
发布于 2021-11-12 02:17:41
发布于 2021-11-12 02:17:41
74200
代码可运行
举报
文章被收录于专栏:性能与架构性能与架构
运行总次数:0
代码可运行

来源:https://juejin.cn/post/6913735652806754311

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

| Controller层 VS Service层

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

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

| 常用校验工具类

使用Hibernate Validate

引入依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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框架中的注解是需要加在实体中一起使用的。

~ 定义一个实体:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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层中的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@PostMapping
public ResponseVO createDataSet(@Valid @RequestBody DataSetSaveVO dataSetVO) {
    return ResponseUtil.success(dataSetService.saveDataSet(dataSetVO));
}

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

使用commons-lang3

引入依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
</dependency>

常用方法说明

测试代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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

| 自定义注解

当上面的方面都无法满足校验的需求以后,可以考虑使用自定义注解。如何写一个自定义注解,可以参考本文作者之前的文章:《Spring自定义注解从入门到精通》。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA高性能架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
第八章:vue生命周期、vue的DOM操作、mixin混入,插件
开发过程中当多个组件开发时有相同类名时,此时vue会按照组件的导入顺序进行解析,后导入的组件 会覆盖先导入的组件类名样式
张哥编程
2024/12/13
1850
Vue 3 获取 DOM
訾博ZiBo
2025/01/06
940
Vue 3 获取 DOM
浅学Vue3
NPM的全称是Node Package Manager,是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准。2020年3月17日,Github宣布收购npm,GitHub现在已经保证npm将永远免费。
QGS
2024/01/14
3940
vue中的 ref 和 $refs
都经历过被Dom操作支配的恐惧,现在很多框架也都帮我们完成了这部分操作,我们不用再去子元素、父元素,只负责数据逻辑即可,如Vue,但是如果我们在某些条件下,依然需要操作Dom时,怎么办呢?Vue提供了ref、$ref。本次,我们就详细讲讲这两个属性。
青年码农
2020/12/17
9580
vue中的 ref 和 $refs
每日一学Vue脚手架中基础的ref属性与原生id区别
vue脚手架的作用是用来自动一键生成vue+webpack的项目模版,包括依赖库,免去你手动安装各种插件,寻找各种cdn并一个个引入的麻烦。
淼学派对
2022/11/20
6410
每日一学Vue脚手架中基础的ref属性与原生id区别
vue操作dom元素的三种方法
vue中的ref是把当前dom元素 “ 抽离出来 ” ,只要通过 this.$refs就可以获取到
我不是费圆
2020/09/22
2.5K0
Vue组件
组件:拆分vue实例代码量,不同的组件来划分不同的功能模块,需要什么功能调用什么组件
切图仔
2022/09/08
6160
Vue组件
vue3与vue2的区别
新增context.emit,与this.$emit(vue3中只能在methods里使用)作用相同
前端小tips
2021/11/29
6930
vue3与vue2的区别
44. Vue使用ref获取dom元素以及组件引用
在普通的js操作中,一般都是直接操作dom元素,但是对于Vue.js框架来说,一般是不允许直接操作dom元素的。
Devops海洋的渔夫
2020/07/20
12.1K0
44. Vue使用ref获取dom元素以及组件引用
Vue子组件与父组件(看了就会)
<font color="red" size=4>另外,组件创建还有两种创建方式:
程序员海军
2022/02/15
1.1K0
vue组件高级(下)
每个vue的组件实例上,都包含一个 refs对象,里面存储着对应的DOM元素或组件的引用。默认情况下,组件的 refs指向一个空对象。
岳泽以
2022/10/26
1.9K0
Vue 05.组件
组件: 组件是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可; 组件化和模块化区别:
LittlePanger
2020/04/14
1K0
Vue篇(010)-vue3如何通过ref属性获取元素
1.在template中的写法跟vue2一样,给元素添加个ref='xxx' 2.在setup中,先创建一个响应式数据,并且要把响应式数据暴露出去 3.当元素被创建出来的时候,就会给对应的响应数据赋值 4.当响应式数据被赋值之后,就可以利用生命周期方法onMounted中获取对应的响应式数据,即DOM元素
齐丶先丶森
2022/05/12
3.7K0
Vue篇(010)-vue3如何通过ref属性获取元素
Vue学习笔记(二)
单页面应用程序 SPA,指的是一个 Web 网站中只有唯一一个 HTML 页面,所有的功能和交互都在这个唯一的页面内完成。
赤蓝紫
2023/01/01
2.4K0
Vue学习笔记(二)
Vue教程(ref和$refs的使用)
  在Vue中一般很少会用到直接操作DOM,但不可避免有时候需要用到,这时我们可以通过ref和$refs这两个来实现,本文我们就来详细的介绍下这个内容
用户4919348
2019/08/03
29.1K0
vue父子组件传值
父组件可以在引用子组件的时候, 通过属性绑定(v-bind:) 的形式, 把需要传递给子组件的数据,以属性绑定的形式,传递到子组件内部,供子组件使用。
砖业洋__
2023/05/06
5630
vue父子组件传值
Vue中$refs的理解
$refs是一个对象,持有注册过ref attribute的所有DOM元素和组件实例。
WindRunnerMax
2020/08/27
1.3K0
一口气复习完 Vue3 相关基础知识点
看完你就基本可以上手搞开发了,本文适合Vue初学者,或者Vue2迁移者,当然还是建议Vue3官网完全过一遍。不适合精通原理,源码的大佬们。
前端达人
2021/09/09
2.4K0
一口气复习完 Vue3 相关基础知识点
7.vue组件(二)--双向绑定,父子组件访问
子组件通过属性props: ["cmessage"], 来接收父组件的message属性. 并且父组件修改message的值, 子组件跟随改变
用户7798898
2021/03/04
1.1K0
7.vue组件(二)--双向绑定,父子组件访问
【Vue.js】934- 一文带你掌握Vue3新特性,再也不怕面试官啦
在Vue2.x时,我们要想给子组件传值,还得单独传入。Vue3.x直接以v-model:xxx形式传入参数,并且配合修饰符.sync进行数据同步更新。
pingan8787
2021/04/26
1.4K0
【Vue.js】934- 一文带你掌握Vue3新特性,再也不怕面试官啦
相关推荐
第八章:vue生命周期、vue的DOM操作、mixin混入,插件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验