使用 @NotEmpty、@NotBlank、@NotNull 注解进行参数校验
使用 @NotEmpty、@NotBlank、@NotNull 注解进行参数校验
- 一、前言
- 二、依赖
- 三、使用 @NotEmpty、@NotBlank、@NotNull 注解进行参数校验
- 1. @NotNull
- 2. @NotEmpty
- 3. @NotBlank
- 4. 区别与适用场景
- 四、实践中的应用
- 五、总结
一、前言
在 Java 开发中,参数校验是确保数据一致性和系统稳定性的重要环节。@NotEmpty、@NotBlank 和 @NotNull 是常用的注解,用于对方法参数进行有效性验证。它们主要用于 Bean Validation 框架,尤其是 Hibernate Validator。下面将详细介绍这三个注解的使用方法和区别。
二、依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
三、使用 @NotEmpty、@NotBlank、@NotNull 注解进行参数校验
在Java应用程序中,数据校验是确保数据有效性和一致性的一个重要方面。Spring框架提供了一些有用的注解来帮助我们进行参数校验,其中 @NotEmpty、@NotBlank 和 @NotNull 是三个常用的注解。本文将详细介绍这三个注解的使用及其适用场景。
1. @NotNull
@NotNull 注解用于确保一个字段的值不能为空。它适用于对象类型的字段(例如,Integer、String、List 等),并且不允许该字段的值为 null。如果字段为 null,校验将失败,并抛出 ConstraintViolationException 异常。
示例代码:
import javax.validation.constraints.NotNull;public class User {@NotNull(message = "Username cannot be null")private String username;@NotNull(message = "Age cannot be null")private Integer age;// Getters and Setters
}
解释:
- 在上述代码中,
username和age字段都使用了@NotNull注解。这意味着在对象的这些字段值为null时,校验将失败,并显示自定义的错误消息。
2. @NotEmpty
@NotEmpty 注解用于确保字段的值既不为 null 也不为空。它适用于字符序列(如 String)、集合(如 List、Set)和数组类型。这个注解不仅要求字段不能为空,还要求其内部不能为空(对于集合和数组来说)。
示例代码:
import javax.validation.constraints.NotEmpty;public class User {@NotEmpty(message = "Username cannot be empty")private String username;@NotEmpty(message = "Roles cannot be empty")private List<String> roles;// Getters and Setters
}
解释:
- 在上述代码中,
username字段和roles列表都使用了@NotEmpty注解。username不能为null或空字符串,roles列表不能为null或空列表。
3. @NotBlank
@NotBlank 注解用于确保字符序列(如 String)字段的值不为空,并且在去除前后空白字符后,字符串仍有内容。它适用于那些需要确保非空的字符串字段,排除了只包含空白字符的情况。
示例代码:
import javax.validation.constraints.NotBlank;public class User {@NotBlank(message = "Username cannot be blank")private String username;@NotBlank(message = "Email cannot be blank")private String email;// Getters and Setters
}
解释:
- 在上述代码中,
username和email字段使用了@NotBlank注解。username和email字段不仅要求不能为空,还要求去除空白字符后不为空。
4. 区别与适用场景
- @NotNull 适用于需要确保字段不为
null的情况,但它允许空字符串和空集合。 - @NotEmpty 适用于需要确保字段既不为
null也不为空的情况,包括空字符串和空集合。 - @NotBlank 适用于需要确保字符序列字段不为
null、不为空且不只包含空白字符的情况。
四、实践中的应用
在Spring Boot应用中,通常将这些注解用于模型类(如 @Entity 或 @Data 类),以确保数据的有效性。此外,这些注解通常与Spring的 @Valid 注解一起使用,以触发自动校验。
可以通过在类上加 @Validated 注解或在方法参数上加 @Valid 注解来启用校验功能。
控制器中的示例:
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import javax.validation.Valid;
import javax.validation.constraints.NotNull;@RestController
@RequestMapping("/users")
@Validated
public class UserController {@PostMappingpublic void createUser(@Valid @RequestBody User user) {// 处理创建用户的逻辑}
}
解释:
- 在上述代码中,
createUser方法使用了@Valid注解来触发对User对象的校验。如果User对象的字段不符合@NotNull、@NotEmpty或@NotBlank的规则,Spring 会自动返回校验错误信息。
五、总结
@NotNull、@NotEmpty 和 @NotBlank 注解为Java应用中的数据校验提供了灵活且强大的支持。通过合理使用这些注解,可以提高代码的健壮性和数据的可靠性。理解它们的区别及适用场景,对于构建健壮的应用程序至关重要。
相关文章:
使用 @NotEmpty、@NotBlank、@NotNull 注解进行参数校验
使用 NotEmpty、NotBlank、NotNull 注解进行参数校验 一、前言二、依赖三、使用 NotEmpty、NotBlank、NotNull 注解进行参数校验1. NotNull2. NotEmpty3. NotBlank4. 区别与适用场景 四、实践中的应用五、总结 一、前言 在 Java 开发中,参数校验是确保数据一致性和…...
关于Qt在子线程中使用通讯时发生无法接收数据的情况
在多线程应用中,串口通讯或TCP通讯的场景常常涉及到持续的读写操作,如果子线程处理不当,可能会导致信号阻塞问题。本文将通过串口通讯或TCP通讯为例,详细解释如何在多线程环境中避免信号阻塞,并提供代码示例。 1. 问题…...
HTML:从历史演进到未来创新的网页基石
该论文为AI生成,请勿运用到正式的论文上,以下仅供参考 一、引言 1.1 研究背景 HTML(Hypertext Markup Language)作为网页构建的基础语言,在互联网的发展历程中占据着至关重要的地位。自 1993 年诞生以来,…...
向量的叉积、点积、外积
向量的叉积、点积和外积是向量代数中非常重要的操作,用于描述向量间的关系。它们广泛应用于物理、计算机图形学、几何以及蛋白质结构分析等领域。下面对每个运算进行详细介绍,并通过 PyTorch 示例代码展示其实现。 1. 点积 (Dot Product) 点积是两个向量之间的数量积,结果…...
UNI-APP 溢出隐藏显示省略号
✍经常在项目里面使用到,又没有记住懒得找了,故此写一篇记录一下! CSS单行显示省略号 /* CSS样式 */ .ellipsis {overflow: hidden; /* 隐藏超出的内容 */text-overflow: ellipsis; /* 显示省略号 */white-space: nowrap; /* 不换行 */ } CS…...
SAP学习笔记 - 开发03 - CDSView开发环境搭建,Eclipse中连接SAP,CDSView创建
上一章讲了BTP的账号创建,环境搭建等内容。 SAP学习笔记 - 开发02 - BTP实操流程(账号注册,BTP控制台,BTP集成开发环境搭建)-CSDN博客 本章继续讲SAP开发。 - CDSView 的开发环境(Eclipse)搭建…...
uniapp写的一个年月日时分秒时间选择功能
代码: <template><view><picker mode"multiSelector" :value"multiIndex" :range"multiRange" change"onMultiChange"><view class"picker">当前选择:{{ formattedDateTime }}</vie…...
golang hertz框架入门
两种模式新建项目 1、手动新建项目 2、使用hz工具新建项目 一、手动创建项目,并拉取框架 1、新建项目目录 hertz_demo_w 2、在项目跟目录新建main.go 文件 package mainimport ("context""github.com/cloudwego/hertz/pkg/app""github.…...
Android Home应用程序启动流程
Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应用程序就是Launcher了,本文将详细分析Launcher应用程序的启…...
C++笔试强训12、13、14
文章目录 笔试强训12一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训13一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训14一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训12 一、选择题 1-5题 引用:是一个别名,与其被引用的实…...
Excel和Word日常使用记录:
Excel使用总结 表格颜色填充: 合并单元格: 选中你要合并的单元格区域。 按下快捷键 Alt H,然后松开这些键。 再按下 M,接着按 C。 这个组合键执行的操作是:Alt H:打开“主页”选项卡。 M:选…...
用Git把本地仓库上传到远程仓库
用Git把本地仓库上传到远程仓库 GitHub创建远程仓库 在创建新仓库界面里输入你的仓库名后点击Create repository就好了。 创建本地项目 当你已经有一个项目后在命令行输入如下指令即可 git init git commit -m "first commit" git branch -M main git remote a…...
OneHotEncoder一个不太合理的地方
OneHotEncoder,在Xtrain上fit,在Xtest上transform 如果遇到某个值出现在Xtest,而没有在Xtrain出现过时,会抛出如下错误: OneHotEncoder Found unknown categories [xxx] in column xx during transform OneHotEncoder …...
如何修复软件中的BUG
笔者上一篇博文《如何开发出一款优秀的软件》主要讲了如何开发一款优秀的软件及相应的必要条件。但对一个已上线,已经成型的产品,该如何解决存在的bug呢?这是本文要阐述的内容。 在这里,首先说一下bug的种类及bug严重程度分类&…...
分享一个基于微信小程序的医院挂号就诊一体化平台uniapp医院辅助挂号应用小程序设计(源码、调试、LW、开题、PPT)
💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…...
HTML生日蛋糕
目录 写在前面 完整代码 代码分析 系列文章 写在最后 写在前面 HTML实现的生日蛋糕来喽,小编亲测,发给好友可以直接打开哦。在代码的第183行可以写下对朋友的祝福,快拿去送给你的好朋友吧! 完整代码 <!DOCTYPE html>…...
【软件逆向】第27课,软件逆向安全工程师之(二)寄存器寻址,每天5分钟学习逆向吧!
寄存器寻址是汇编语言中的一种寻址方式,在这种方式中,操作数位于CPU的寄存器中。寄存器是CPU内部的高速存储位置,用于快速访问数据。以下是关于寄存器寻址的详细信息: 寄存器寻址的特点: 操作数在寄存器中࿱…...
前缀和 — 利用前缀信息解决子数组问题
【前缀和的核心思想是预先处理数组来快速计算任意子数组的和,基本上用于数组和序列问题。】 前缀和算法具体步骤 构造前缀和数组: 给定一个数组nums,其前缀和数组prex定义为prex[i]表示为数组nums从起始位置到第i个位置的元素累加和。构建前…...
2024年最新版Ajax+Axios 学习【包含原理、Promise、报文、接口等...】
基础知识 AJAX概念 AJAX概念:是浏览器与服务器进行数据通信的技术。 认识URL 定义:统一资源定位符,简称网址,用于访问网络上的资源。 组成: http协议:超文本传输协议,规定浏览器和服务器之…...
【Qt线程】—— Qt线程详解
目录 (一)多线程的概述 (二)Qt线程的使用条件 (三)创建线程的方法 3.1 继承QTread,重写run()函数 3.1.1 为什么要重写 3.2 继承QObject 3.3 核心API介绍 3.4 关闭线程的使用方法 &…...
Qwen-Image-Layered快速部署:ComfyUI镜像一键启动与配置
Qwen-Image-Layered快速部署:ComfyUI镜像一键启动与配置 1. 引言:图像分层的革命性突破 1.1 传统图像编辑的痛点 在常规的图像处理流程中,我们常常遇到一个根本性难题:图像一旦生成或拍摄完成,就变成了一个"不…...
基于MATLAB的齿轮系统非线性动力学特性分析:参数阻尼比变化调节下的输出结果
基于matlab的齿轮系统非线性动力学特性分析 基于matlab的齿轮系统非线性动力学特性分析,综合考虑齿侧间隙、时变啮合刚度、综合啮合误差等因素下,参数阻尼比变化调节下,输出位移、相图、载荷、频率幅值结果 程序已调通,可直接运行…...
如何保证 Session ID 的随机性和不可猜测性?
你的 Session ID 安全吗?—— 从可预测的“门禁卡”到安全的“加密钥匙”1. 引言:一张编号可以被猜到的门禁卡2. Session 与 Session ID:会话的“钥匙”3. 为什么 Session ID 必须随机且不可预测?4. 攻击详解:会话劫持…...
SAP SD实战:用‘品目阶层’给老板打报表,别再手动筛选了(附OVSV配置步骤)
SAP SD实战:用‘品目阶层’高效生成管理层报表的完整指南 每次月底做销售报表时,你是不是还在手动筛选"男装-夏装"这类产品线数据?作为SAP SD顾问,我经历过无数次熬夜整理Excel表格的痛苦。直到真正掌握了品目阶层的报表…...
告别重复造轮子,用快马ai一键生成rabbitmq多模式高效代码模板
最近在项目中频繁使用RabbitMQ处理消息队列,发现手动编写各种模式的代码既耗时又容易出错。特别是当业务需要切换不同消息模式时,往往要重新查阅文档、调试参数。经过一番摸索,我总结出一套高效使用RabbitMQ的方法,并借助InsCode(…...
STM32C8T6+AS608指纹模块实战:从接线到代码调试的全流程避坑指南
STM32C8T6AS608指纹模块实战:从接线到代码调试的全流程避坑指南 指纹识别技术正逐渐渗透到日常生活的各个角落,从手机解锁到门禁系统,这项技术为我们提供了便捷与安全的双重保障。对于嵌入式开发者而言,将指纹识别功能整合到自己的…...
从零构建:基于OpenCV与人体姿态分析的跌倒检测实战(附完整源码)
1. 为什么我们需要跌倒检测系统 想象一下家里的老人独自在客厅活动时突然摔倒的场景。这种意外在现实生活中并不罕见,尤其是对于行动不便的老年人群体。传统的解决方案往往依赖于佩戴式设备或紧急呼叫按钮,但这些方法要么需要用户主动操作,要…...
【实时场景复原 】实时光照校正方法,可在沙尘、水下及雾霾等退化场景中复原清晰场景研究附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...
3分钟掌握Playnite便携版:打造你的移动游戏库管理中心
3分钟掌握Playnite便携版:打造你的移动游戏库管理中心 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目地址: htt…...
Qwen3.5-9B效果展示:中文新闻事件抽取+时间线生成+关联人物图谱
Qwen3.5-9B效果展示:中文新闻事件抽取时间线生成关联人物图谱 1. 模型核心能力概览 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型,在中文处理和多模态理解方面展现出卓越能力。这个模型特别适合处理复杂的文本分析任务,能够从海量信息中提…...
