Spring注解@NoNull、@NotEmpty、@NotBlank的区别及注解无效以及嵌套对象的无效解决办法

1.三者的区别
@NotNull:
不能为null,但可以为empty(“”," “,” “) ,一般用在基本数据类型的非空校验上,而且被其标注的字段可以使用 @size/@Max/@Min对字段数值进行大小的控制
@NotEmpty:
不能为null,而且长度必须大于0(” “,” "),一般用在集合类上面
@NotBlank:
不能为null,注意是只能用在String上,而且调用trim()后,长度必须大于0

简述三者区别
@NotNull://CharSequence, Collection, Map 和 Array 对象不能是 null, 但可以是空集(size = 0)。
@NotEmpty://CharSequence, Collection, Map 和 Array 对象不能是 null 并且相关对象的 size 大于 0。
@NotBlank://String 不能是 null 且去除两端空白字符后的长度(trimmed length)大于 0。

2.失效问题
(1)单个对象无效,必须在controller中加上@Valid 或者@Validated。@Validated要和@NotEmpty组合使用

import org.springframework.validation.annotation.Validated;public ResultModel test(@Validated @RequestBody TestParam testParam){
}

(2)嵌套对象,对象的对象中失效解决办法,需要在外层对象的属性上加@Valid

import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotBlank;@Data
public class TestParam {@NotBlankprivate String className;@Validatedprivate List<UserDTO> users;
}
import javax.validation.constraints.NotBlank;@Data
public class UserDTO {@NotBlankprivate String name;}

isEmpty 和 isBlank 区别
org.apache.commons.lang3.StringUtils 类提供了 String 的常用操作,最为常用的判空有如下两种 isEmpty(String str) 和 isBlank(String str)。

分析
我们通过源码来分析区别:

/**
* <p>Checks if a CharSequence is empty ("") or null.</p>
*
* <pre>
* StringUtils.isEmpty(null)      = true
* StringUtils.isEmpty("")        = true
* StringUtils.isEmpty(" ")       = false
* StringUtils.isEmpty("bob")     = false
* StringUtils.isEmpty("  bob  ") = false
* </pre>
*/
public static boolean isEmpty(final CharSequence cs) {return cs == null || cs.length() == 0;
}
/**
* <p>Checks if a CharSequence is not empty ("") and not null.</p>
*
* <pre>
* StringUtils.isNotEmpty(null)      = false
* StringUtils.isNotEmpty("")        = false
* StringUtils.isNotEmpty(" ")       = true
* StringUtils.isNotEmpty("bob")     = true
* StringUtils.isNotEmpty("  bob  ") = true
* </pre>
*/
public static boolean isNotEmpty(final CharSequence cs) {return !isEmpty(cs);
}
/*** <p>Checks if a CharSequence is empty (""), null or whitespace only.</p>** <p>Whitespace is defined by {@link Character#isWhitespace(char)}.</p>** <pre>* StringUtils.isBlank(null)      = true* StringUtils.isBlank("")        = true* StringUtils.isBlank(" ")       = true* StringUtils.isBlank("bob")     = false* StringUtils.isBlank("  bob  ") = false* </pre>*
*/
public static boolean isBlank(final CharSequence cs) {final int strLen = length(cs);if (strLen == 0) {return true;}for (int i = 0; i < strLen; i++) {if (!Character.isWhitespace(cs.charAt(i))) {return false;}}return true;
}
/*** <p>Checks if a CharSequence is not empty (""), not null and not whitespace only.</p>** <p>Whitespace is defined by {@link Character#isWhitespace(char)}.</p>** <pre>* StringUtils.isNotBlank(null)      = false* StringUtils.isNotBlank("")        = false* StringUtils.isNotBlank(" ")       = false* StringUtils.isNotBlank("bob")     = true* StringUtils.isNotBlank("  bob  ") = true* </pre>*
*/
public static boolean isNotBlank(final CharSequence cs) {return !isBlank(cs);
}

可以看到:

StringUtils.isEmpty(final CharSequence cs) 判断某字符串是否为空,为空的标准是 cs == null 或者cs.length() == 0
StringUtils.isBlank(final CharSequence cs) 判断某字符串是否为空或长度为 0 或由空白符 (whitespace) 构成
StringUtils.isNotEmpty(final CharSequence cs) 等价于 !isEmpty(final CharSequence cs)
StringUtils.isNotBlank(final CharSequence cs) 等价于 !isBlank(final CharSequence cs), 我自己更喜欢使用StringUtils.isBlank(final CharSequence cs)来执行判空操作,因为判断的条件更多更具体,特别是进行参数校验时,推荐使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/709037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配置资源管理Secret

目录 一、什么是Secret? 二、secret的三种类型 三、pod适用secret的三种方式 四、secret实例 1、创建secret 2、使用Secret方式 一、什么是Secret? Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源&#xff0c;目的是为了更方便的控制使用数据&#xff0c;并…

GDB动态调试学习-2-【断点】

文章目录 在程序地址上打断点在程序入口处打断点获取程序入口地址 在命名空间设置断点命名空间给命名空间的函数下断电 在文件行号上打断点保存已经设置的断点设置临时断点设置条件断点command指令 忽略断点 在程序地址上打断点 当调试汇编程序&#xff0c;或者没有调试信息的…

【扩散模型第三篇】Classifier Guidance 和 Classifier Free Guidance(CFG)

参考&#xff1a; [1] 张振虎博客 [2] https://www.bilibili.com/video/BV1s8411i7cU/?spm_id_from333.788&vd_source9e9b4b6471a6e98c3e756ce7f41eb134 [3] https://zhuanlan.zhihu.com/p/660518657 [4] https://zhuanlan.zhihu.com/p/640631667 进食顺序 1 前言2 Classi…

【c++】stack和queue模拟实现

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;能手撕stack和queue模拟 > 毒鸡汤&#xff1a;…

DataGrip2023配置连接Mssqlserver、Mysql、Oracle若干问题解决方案

1、Mssqlserver连接 本人连的是Sql2008&#xff0c;默认添加时&#xff0c;地址、端口、实例、账号、密码后&#xff0c;测试连接出现错误。 Use SSL&#xff1a;不要勾选 VM option&#xff1a;填写&#xff0c;"-Djdk.tls.disabledAlgorithmsSSLv3, RC4, DES, MD5withR…

【Redis | 第五篇】一篇文章看懂布谷鸟过滤器

文章目录 5.布谷鸟过滤器5.1起源介绍5.2原理5.2.1演示步骤&#xff08;1&#xff09;保存元素&#xff08;两个位置均为空&#xff09;&#xff08;2&#xff09;保存元素&#xff08;其中一个位置被占&#xff09;&#xff08;3&#xff09;保存元素&#xff08;两个位置都被占…

Linux小项目:在线词典开发

在线词典介绍 流程图如下&#xff1a; 项目的功能介绍 在线英英词典项目功能描述用户注册和登录验证服务器端将用户信息和历史记录保存在数据中。客户端输入用户和密码&#xff0c;服务器端在数据库中查找、匹配&#xff0c;返回结果单词在线翻译根据客户端输入输入的单词在字…

轻松玩转Git

轻松玩转Git 快速入门什么是Git为什么要做版本控制安装git Git实战单枪匹马开始干拓展新功能小结 紧急修复bug分支紧急修复bug方案命令总结工作流 上传GitHub第一天上班前在家上传代码初次在公司新电脑下载代码下班回到家继续写代码到公司继续开发在公司约妹子忘记提交代码回家…

CDH6.3.1离线安装

一、从官方文档整体认识CDH 官方文档地址如下&#xff1a; CDH Overview | 6.3.x | Cloudera Documentation CDH是Apache Hadoop和相关项目中最完整、测试最全面、最受欢迎的发行版。CDH提供Hadoop的核心元素、可扩展存储和分布式计算&#xff0c;以及基于Web的用户界面和重…

使用Rust 实现文件批量下载

1.概述 Rust 是一种高效的系统编程语法&#xff0c;具有安全、并发和实用性的特点。本篇文章将通过实例详细介绍如何使用Rust来实现文件的批量下载功能&#xff0c;并提供示例以帮助读者理解。我们的实例将分为四个部分来详细描述&#xff1a;准备环境、创建主函数、实现下载函…

Mysql8.0 数据类型介绍

1&#xff0c;数值类型 1.1 整数类型 TINYINT&#xff1a;微整数&#xff0c;1字节 SMALLINT&#xff1a;小整数&#xff0c;2字节 MEDIUMINT&#xff1a;中等整数&#xff0c;3字节 INT&#xff1a;整数&#xff0c;4字节 BIGINT&#xff1a;大整数&#xff0c;8字节 如…

蓝桥杯备战刷题three(自用)

1.合法日期 #include <iostream> #include <map> #include <string> using namespace std; int main() {map<string,int>mp;int days[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};for(int i1;i<12;i){for(int j1;j<days[i];j){string sto_strin…

江苏双线服务器租用的优势有哪些?

随着互联网的快速发展&#xff0c;服务器也随着科技的发展变得多种多样&#xff0c;其中双线服务器租用格外受大家关注&#xff0c;那么江苏双线服务器租用到底有哪些优势呢&#xff1f; 1.网络环境稳定 江苏双线服务器租用的主要优点就是有着高速稳定的网络环境&#xff0c;双…

P4198 楼房重建题解(线段树, 分治)

题目描述 题面 简要题意&#xff1a; 给你一个长度为 n n n 的序列 a i a_i ai​ ( n ≤ 1 0 5 n \leq 10^5 n≤105)&#xff0c;要求进行 m m m 次操作 ( m ≤ 1 0 5 m \leq 10^5 m≤105) 。操作分两种&#xff1a; 1.单点修改。 2.查询整个序列中有多少个位置 x x x 满…

动态规划(背包理论)-算法题

416. 分割等和子集 题目 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, …

Vivado Vitis 2023.2 环境配置 Git TCL工程管理 MicroBlaze和HLS点灯测试

文章目录 本篇概要Vivado Vitis 环境搭建Vivado 免费标准版 vs 企业版Vivado Windows 安装Vivado 安装更新 Vivado 工程操作GUI 创建工程打开已有工程从已有工程创建, 重命名工程GUI导出TCL, TCL复原工程TCL命令 Vivado 版本控制BlinkTcl脚本新建导出重建工程纯Verilog BlinkTc…

js处理IOS虚拟键盘弹出后输入框被遮住

​ JS IOS 前言 在项目开发的过程中&#xff0c;在IOS手机端系统下&#xff0c;当对输入框&#xff08;input/textarea&#xff09;进行focus操作时&#xff0c;键盘弹起遮住输入框。 问题描述 从页面底部focus输入框失败从页面中间focus输入框失败 原因 造成上述问题的&…

【MySQL】_自连接与子查询

目录 1. 自连接 2. 子查询&#xff08;嵌套查询&#xff09; 2.1 子查询分类 2.2 单行子查询示例1&#xff1a;查询不想毕业同学的同班同学 2.3 多行子查询示例2&#xff1a;查询语文或英语课程的信息成绩 3. 合并查询 3.1 示例1&#xff1a;查询id3或者名字为英文的课程…

Flutter 处理异步操作并根据异步操作状态动态构建界面的方法FutureBuilder

概述 当界面的内容需要依靠网络请求的数据&#xff0c;就需要处理苦恼的&#xff0c;状态是空&#xff0c;非空的逻辑了&#xff0c;不然页面构建可能会报错&#xff0c;而FutureBuilder提供了一个非常好的解决方法&#xff0c;直接看代码 代码 异步操作函数 即网络请求函数…

[CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解

一、分析判断 进入靶机&#xff0c;主页面如图&#xff1a; 主页面提供给我们一条关键信息&#xff1a; flag值在 表flag 中的 flag列 中。 接着我们尝试输入不同的id&#xff0c;情况分别如图&#xff1a; 当id1时&#xff1a; 当id2时&#xff1a; 当id3时&#xff1a; 我…