@NotNull、@NotEmpty和@NotBlank的区别;常见的校验注解;@Validated跟@Valid注解的区别

本文详细解析了Java中常见的校验注解,包括@NotNull、@NotEmpty、@NotBlank等的区别与应用场景,以及@Validated与@Valid在嵌套验证上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@NotNull、@NotEmpty和@NotBlank的区别

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

常见的校验注解:

@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction)
限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 验证注解的元素值(日期类型)比当前时间早
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

@Validated跟@Valid注解的区别:

@Validated是spring的注解,而@Valid是javax的注解;

@Validated:用在方法入参上无法单独提供嵌套验证功能。不能用在成员属性(字段)上,也无法提示框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。
@Valid:用在方法入参上无法单独提供嵌套验证功能。能够用在成员属性(字段)上,提示验证框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。

附加:

@Validated和BindingResult bindingResult是配对出现,并且形参顺序是固定的(一前一后)。

转载于啊鹏驾到

<think>我们正在处理用户的问题:如何对List<String>类型的字段进行非空校验,使用类似@NotNull注解。 根据引用[1]引用[2]的内容,我们知道: - @NotNull:用于任何类型,表示不能为null,但可以为空(比如空集合、空字符串等)。 - @NotEmpty:用于集合、数组、字符串等,表示不能为null,并且长度/大小必须大于0(即不能为空集合或空字符串)。 - @NotBlank:只用于字符串,表示不能为null,并且trim后的长度大于0(即不能是空白字符串)。 用户的需求是校验一个List<String>是否为空。这里“为空”可能有两种含义: 1. 不能为null(但允许空列表,即size=0) -> 使用@NotNull 2. 不能为null且不能为空列表(即size>0) -> 使用@NotEmpty 因此,我们需要明确用户的需求是哪种。但通常,当我们说“非空”时,往往指的是第二种:既不能为null也不能为空列表。 所以,对于List<String>字段,我们推荐使用@NotEmpty注解。 另外,引用[2]中提到,为了让这些注解生效,我们需要在Controller或Service层使用@Validated@Valid来触发校验。 下面我们给出一个示例: 假设我们有一个DTO类,其中有一个List<String>字段,我们希望它不能为null且不能为空列表(即至少有一个元素): ```java public class MyDto { @NotEmpty(message = "列表不能为空") private List<String> myList; // getter and setter } ``` 然后在Controller中使用: ```java @RestController @Validated // 类级别使用@Validated,或者也可以在方法参数上使用@Validated,但通常类级别加上,并且配合方法参数上的@Valid public class MyController { @PostMapping("/test") public ResponseEntity<?> testEndpoint(@Valid @RequestBody MyDto myDto) { // 业务逻辑 return ResponseEntity.ok("校验通过"); } } ``` 注意: - 在Controller方法参数上,我们使用@Valid(或@Validated)来触发对MyDto的校验。 - 在MyDto的字段上,我们使用@NotEmpty来确保myList不为null且不为空。 如果用户希望允许空列表(即size=0)但不允许null,那么可以使用@NotNull。 因此,根据用户的具体需求,选择注解: - 禁止null,但允许空列表:@NotNull - 禁止null且禁止空列表:@NotEmpty 另外,如果用户需要校验列表中的每个字符串元素都不为空(即每个字符串都不能是空白字符串),那么可能需要自定义注解或者使用其他方式,因为@NotBlank只能用在字符串字段上,不能直接用于列表中的元素。 如果用户需要校验列表中的每个字符串元素都不为空(非空白),我们可以这样: - 使用@NotEmpty确保列表不为空(即至少有一个元素) - 再使用一个自定义注解或者使用Hibernate Validator提供的@NotBlank注解作用在列表元素上?但是默认情况下,Hibernate Validator提供了对集合元素校验的支持,我们可以使用: ```java public class MyDto { @NotEmpty(message = "列表不能为空") @Size(min = 1, message = "列表至少有一个元素") // 这个其实@NotEmpty重复了,@NotEmpty已经确保至少有一个元素 private List<@NotBlank(message = "列表中的每个字符串不能为空") String> myList; } ``` 但是,请注意,在Java 8及以上,我们可以使用这种嵌套的注解(称为容器元素约束)。但是需要确保你的Hibernate Validator版本支持(5.2以上?)并且开启了相关配置(默认情况下,Hibernate Validator 6.0以上支持)。 然而,根据用户的环境,可能需要检查是否支持。如果不支持,可能需要自定义注解。 不过,用户的问题主要是针对List本身是否为空的校验,所以我们先解决List本身的问题。 因此,回答用户:对于List<String>字段,如果希望它不能为null且不能为空列表(没有元素),则使用@NotEmpty注解。 另外,提醒用户需要在Controller或Service层使用@Validated@Valid来触发校验。 如果用户有进一步的需求(如校验每个字符串元素),我们再展开。 现在,生成相关问题: 1. 如何校验List中的每个元素? 2. 除了@NotEmpty,还有哪些常用的校验注解? 3. 为什么加了@NotEmpty注解却没有生效(可能的原因)? 4. 如何自定义校验注解?</think>针对 Java 中 `List<String>` 类型的非空校验,推荐使用以下注解方案: ### 解决方案 1. **基础校验注解** - **`@NotEmpty`**(首选方案) 验证列表不能为 `null` **且** 长度必须大于 0(即不能为空列表)。 示例: ```java import javax.validation.constraints.NotEmpty; import java.util.List; public class UserRequest { @NotEmpty(message = "列表不能为空") private List<String> items; // 禁止 null 空列表 } ``` - **`@NotNull`**(次选方案) 仅验证列表不能为 `null`,但允许空列表(`size()=0`)。 示例: ```java import javax.validation.constraints.NotNull; import java.util.List; public class UserRequest { @NotNull(message = "列表不能为 null") private List<String> items; // 允许空列表,禁止 null } ``` 2. **触发校验的配置** 在 Controller 或 Service 层添加 **`@Valid`** 或 **`@Validated`** 激活校验: ```java @RestController public class UserController { @PostMapping("/submit") public ResponseEntity<?> submitData(@Valid @RequestBody UserRequest request) { // 触发校验逻辑 return ResponseEntity.ok("校验通过"); } } ``` ### 关键区别 | 注解 | 作用范围 | 校验规则 | 适用场景 | |------------|----------------|------------------------------|------------------------------| | `@NotEmpty`| `List<String>` | 禁止 `null` **且** 禁止空列表 | 需确保列表必有元素 | | `@NotNull` | 任意类型 | 仅禁止 `null` | 允许空列表但禁止 `null` 时用 | ### 常见问题排查 1. **校验未生效?** - 检查是否漏加 **`@Valid`**(如示例中的 `@Valid @RequestBody`)[^2]。 - 确认依赖包含 `spring-boot-starter-validation`(Spring Boot)或 `hibernate-validator`(非 Spring 项目)。 2. **嵌套对象校验?** 如需校验 `List` 中的每个元素(如字符串非空),需结合 **`@NotBlank`**: ```java public class UserRequest { @NotEmpty private List<@NotBlank String> items; // 每个字符串元素不能为空白 } ``` ### 相关问题 1. 如何校验 `List` 中每个字符串元素的格式(如邮箱、正则)? 2. `@Valid` `@Validated` 注解有什么区别?[^2] 3. 自定义校验注解(如 `@ListSize(min=1, max=10)`)如何实现? 4. 全局异常处理如何捕获校验失败的错误信息? [^1]: 校验注解 `@NotNull` 适用于基本数据类型对象,而 `@NotEmpty` 专为集合、数组字符串设计。 [^2]: `@Valid` 用于方法参数触发校验,`@Validated` 用于类或方法级别开启校验支持(支持分组校验)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值