Java开发-参数校验@NotEmpty、@NotBlank、@NotNull

news/2025/2/21 4:47:28/

大家好,我是小资。今天给大家说下参数校验。

标题中说的这三个注解所在的包路径为import javax.validation.constraints.*;

千万不要导错包哦,因为他们在好多包里都存在。开发只需引入Spring-web依赖就可以使用了。轻轻松松干掉多余的if-else。

下面我们就一起看看它们具体怎么使用和有什么区别呢。

介绍和区别

@NotNull

适用于基本数据类型(Integer,Long,Double等等),当 @NotNull 注解被使用在 String 类型的数据上,则表示该数据不能为 Null(但是可以为 Empty)

源码包注释

源码注释翻译:被注释的元素不能为空。接受任何类型。

注:被其标注的字段可以使用 @size、@Max、@Min 对字段数值进行大小的控制

@NotBlank

适用于 String 类型的数据上,加了@NotBlank 注解的参数不能为 Null 且 trim() 之后 size > 0,必须有实际字符

源码包注释

源码注释翻译:带注释的元素不能为空,并且必须包含至少一个非空白字符。接受CharSequence。

@NotEmpty

适用于 String、Collection集合、Map、数组等等,加了@NotEmpty 注解的参数不能为 Null 或者 长度为 0

源码包注释

源码注释翻译:被注释的元素既不能为null也不能为空。

使用方法

实体类使用方法

@Data

@EqualsAndHashCode(callSuper = false)

@Accessors(chain = true)

public class ArticleRequest implements Serializable {

private static final long serialVersionUID=1L;

@NotBlank(message = "请填写文章标题")

@Length(max = 200, message = "文章标题最多200个字符")

private String title;

@NotBlank(message = "请填写文章作者")

@Length(max = 50, message = "文章作者最多50个字符")

private String author;

@NotNull(message = "是否热门不能为空")

private Boolean isHot;

@NotEmpty(message = "其他推荐文章不能为空")

private List<ArticleRequest> articleRequestList;

}

Controller方法的使用

以上这些校验的注解都是需要@Valid 或@Validated 配合上使用才会生效的,还可以对新增和修改做单独的配置

@Valid 包位置:import javax.validation.Valid;

@Validated 包的位置:

import org.springframework.validation.annotation.Validated;

/**

* 新增文章管理表

* @param articleRequest 新增参数

*/

@RequestMapping(value = "/save", method = RequestMethod.POST)

public CommonResult<String> save(@RequestBody @Valid ArticleRequest articleRequest) {

if (articleService.create(articleRequest)) {

return CommonResult.success();

} else {

return CommonResult.failed();

}

}

/**

* 新增文章管理表

* @param articleRequest 新增参数

*/

@RequestMapping(value = "/save", method = RequestMethod.POST)

public CommonResult<String> save(@RequestBody @Validated ArticleRequest articleRequest) {

if (articleService.create(articleRequest)) {

return CommonResult.success();

} else {

return CommonResult.failed();

}

}

@Valid 和 @Validated 比较

最后我们来对 @Valid 和 @Validated 两个注解简单对比下

  • @Valid 和 @Validated 两者都可以对数据进行校验,待校验字段上打的规则注解(@NotNull, @NotEmpty等)都可以对 @Valid 和 @Validated 生效;

  • @Valid 进行校验的时候,需要用 BindingResult 来做一个校验结果接收。当校验不通过的时候,如果手动不 return ,则并不会阻止程序的执行;

  • @Validated 进行校验的时候,当校验不通过的时候,程序会抛出400异常,阻止方法中的代码执行,这时需要再写一个全局校验异常捕获处理类,然后返回校验提示。

总体来说,@Validated 使用起来要比 @Valid 方便一些,它可以帮我们节省一定的代码,并且使得方法看上去更加的简洁。

新增和修改单独配置

在开发中我们会遇到某些字段是新增是必传的而修改不是必传,这种情况我们就可以单独对其进行指定。以下为配置方法。

  • 字段配置

@NotBlank(message = "名称不能为空", groups = { AddGroup.class, EditGroup.class })

private String name;

其中groups属性就可以实现该字段的单独设置说,其中AddGroup和EditGroup是自己定义的两个接口文件,它们两个类中没有任何代码,只需要将接口创建下即可。

  • @Validated指定

@Validated(EditGroup.class)

在注解中填写需要校验的场景,以上事例为只校验修改,其参数是数组格式,需要填写多个时换成数组格式即可

@Validated({AddGroup.class,EditGroup.class})

此包下其它常用的校验注解:

其他注解和解释

总结

  • @NotEmpty :用于集合类,不能为null,且size>0

  • @NotNull:不能为null,但可以为empty,没有size的约束

  • @NotBlank:只用于String,不能为null,且trim()之后size>0

  • @Validated比@Valid较为好用

结束语

以上则参数校验的注解使用和对比,快去试试吧!

如果大家觉得文章内容不错,快去分享给更多小伙伴吧。

创作不易,感谢大家的支持,多多关注、分享、点赞,您的鼓励是我前进的动力。


http://www.ppmy.cn/news/1149284.html

相关文章

求二叉树第K层的节点个数——递归

int BinaryTreeLevelKSize(BTNode* root, int k) {assert(k > 0);if (root NULL){return 0;}if (k 1){return 1;}return BinaryTreeLevelKSize(root->left, k - 1) BinaryTreeLevelKSize(root->right, k - 1); }

C# redis通过stream实现消息队列以及ack机制

redis实现 查看redis版本 redis需要>5.0 Stream 是 Redis 5.0 引入的一种专门为消息队列设计的数据类型&#xff0c;Stream 是一个包含 0 个或者多个元素的有序队列&#xff0c;这些元素根据 ID 的大小进行有序排列。 它实现了大部分消息队列的功能&#xff1a; 消息 ID…

扫描器(xray和bp联动)

文章目录 分类主动扫描和被动扫描bp与xray联动 分类 扫描器分为对web的扫描器和对主机的扫描器 主动扫描和被动扫描 主动扫描&#xff1a; 输入某个URL&#xff0c;然后由扫描器中的爬虫模块爬取所有链接&#xff0c;对GET、POST等请求进行参数变形和污染&#xff0c;进行重放测…

input标签的23种type类型

一、概述 随着html5的出现&#xff0c;input标签新增了多种类型&#xff0c;用以接收各种类型的用户输入。其中传统输入控件有10种&#xff0c;新增输入控件有13种。 二、传统类型 传统输入控件有10种&#xff0c;如下所示。 text 定义单行文本输入框 password 定…

Gemmini测试test文件chisel源码详解(二)

HeaderGenerationUnitTest.scala 源码如下&#xff1a; package gemminiimport org.scalatest.FlatSpecclass HeaderGenerationUnitTest extends FlatSpec {it should "generate a header" in {println(GemminiConfigs.defaultConfig.generateHeader())} } Header…

【java学习】构造方法重载(26)

文章目录 构造方法(构造器)的重载 构造方法(构造器)的重载 构造器一般用来创建对象的同时初始化对象。如 class Person{         String name;         int age; public Person(String n , int a){         namen; agea;         } } 构造器…

203、RabbitMQ 之 使用 direct 类型的 Exchange 实现 消息路由 (RoutingKey)

目录 ★ 使用direct实现消息路由代码演示这个情况二ConstantUtil 常量工具类ConnectionUtil 连接RabbitMQ的工具类Publisher 消息生产者测试消息生产者 Consumer01 消息消费者01测试消费者结果&#xff1a; Consumer02 消息消费者02测试消费者结果&#xff1a; 完整代码&#x…

【GO】基础速成

简单介绍一下go好处 编译语言&#xff0c;可以提前报错同时又有python的一些优点&#xff0c;自带多线程 开始学习 学习网站&#xff1a;学习网站 值 包含&#xff1a;字符串、整型、浮点型、布尔型等等 字符串可以 进行拼接。 需要注意的是布尔型在go里面不自动转化为in…