@NotNull, @NotBlank,@NotEmpty,你用對(duì)了嗎?
@NotNull、@NotEmpty 和 @NotBlank 是 Java Bean Validation(如 Hibernate Validator)中常用的注解,用于校驗(yàn)字段的有效性。它們之間有不同的適用場(chǎng)景和約束條件。這篇文章,我們將詳細(xì)解釋它們的區(qū)別及使用場(chǎng)景。
1. @NotNull
@NotNull的作用是僅確保字段不為 null。因此,對(duì)于字符串來(lái)說(shuō),允許為空字符串 ("");對(duì)于集合等,也只檢查是否為 null,不檢查是否為空集合。
@NotNull適用于任何類(lèi)型的對(duì)象(如字符串、集合、自定義對(duì)象等)。
如下示例,展示了@NotNull注解的使用:
public class User {
@NotNull(message = "用戶名不能為空")
private String username;
}
2. @NotEmpty
@NotEmpty 的作用是確保字段不為 null,且不為空。因此,對(duì)于字符串來(lái)說(shuō),長(zhǎng)度必須大于 0,""(空字符串)被認(rèn)為是無(wú)效的;對(duì)于集合等,大小必須大于 0。
@NotEmpty 可以適用于以下幾種類(lèi)型:
- String
- Collection(如 List, Set)
- Map
- Array
如下示例,展示了@NotEmpty注解的使用::
public class User {
@NotEmpty(message = "用戶名不能為空")
private String username;
@NotEmpty(message = "角色列表不能為空")
private List<String> roles;
}
3. @NotBlank
@NotBlank的作用是確保字符串不為 null,且.trim()后長(zhǎng)度大于 0(即不僅不為空,還至少包含一個(gè)非空白字、制表符等)。
@NotBlank僅適用于 String 類(lèi)型。
如下示例,展示了@NotBlank注解的使用:
public class User {
@NotBlank(message = "密碼不能為空")
private String password;
}
4. 三者對(duì)比
下面通過(guò)一張圖表,對(duì)三者進(jìn)行詳細(xì)的對(duì)比:
注解 | 適用類(lèi)型 | 校驗(yàn)條件 |
@NotNull | 任意引用類(lèi)型 | 對(duì)象不為 null |
@NotEmpty | String,Collection,Map,Array | 對(duì)象不為 null,且長(zhǎng)度或大小大于 0 |
@NotBlank | String | 字符串不為 null,且.trim()后長(zhǎng)度大于 0 |
5. 使用場(chǎng)景
- @NotNull:當(dāng)只需要確保某個(gè)字段被賦值(不關(guān)心內(nèi)容)時(shí)。例如,用戶的ID字段在數(shù)據(jù)庫(kù)中不能為空。
- @NotEmpty:當(dāng)需要確保某個(gè)集合或字符串不僅被賦值,而且包含至少一個(gè)元素或字符時(shí)。例如,用戶注冊(cè)時(shí)需要至少有一個(gè)角色。
- @NotBlank:當(dāng)需要確保字符串不僅被賦值,而且包含實(shí)際的非空白字符時(shí)。例如,用戶注冊(cè)時(shí)的密碼字段不能只是空格。
6. 示例代碼
下面我們通過(guò)一個(gè)示例同時(shí)演示 3個(gè)注解的使用:
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
public class User {
@NotNull(message = "用戶ID不能為空")
private Long id;
@NotEmpty(message = "用戶名不能為空")
private String username;
@NotBlank(message = "密碼不能為空且不能全為空白")
private String password;
@NotEmpty(message = "角色列表不能為空")
private List<String> roles;
// Getters and Setters
}
在上述示例中:
- id 只需要不為 null。
- username 需要不為 null 且不為空字符串。
- password 需要不為 null,不為空字符串,并且至少包含一個(gè)非空白字符。
- roles 需要不為 null,且至少包含一個(gè)角色。
7. 總結(jié)
本文,我們?cè)敿?xì)地分析了三個(gè)注解以及它們之間地對(duì)比。@NotNull僅校驗(yàn)對(duì)象不為null,適用于所有引用類(lèi)型;@NotEmpty確保集合、數(shù)組或字符串不為null且有長(zhǎng)度;@NotBlank專(zhuān)用于字符串,要求不為null、不為空且包含非空白字符。根據(jù)字段類(lèi)型和校驗(yàn)需求選擇合適的注解,以確保數(shù)據(jù)的完整性和有效性。
通過(guò)合理使用這些注解,可以確保數(shù)據(jù)的完整性和有效性,減少潛在的運(yùn)行時(shí)錯(cuò)誤。