@NotNull、@NotBlank 和 @NotEmpty 注解的区别
在Java的Bean Validation(JSR 303/380)规范中,@NotNull、@NotBlank和@NotEmpty是用于验证字段或属性是否满足特定非空条件的注解。虽然它们的目标相似,但它们在细节上有所不同。下面是对这三个注解的详细解释和比较。
1. @NotNull
- 来源:
javax.validation.constraints.NotNull
- 用途: 用于验证基本类型对象(int、long等)或对象引用(如String、List等)不是
null
。 - 适用范围: 字段、方法、参数上。
- 示例: 确保一个用户对象在保存之前其名字不是
null
。public class User { @NotNull private String name; }
如果name
是null
,那么在验证时将会抛出异常。
2. @NotBlank
- 来源:
org.hibernate.validator.constraints.NotBlank
- 用途: 用于验证字符串不是
null
且trim()之后长度大于0,即字符串不是空字符串也不是只包含空白字符的字符串。 - 适用范围: 只能用于字符串类型的字段上。
- 示例: 确保表单提交的用户名不是空白字符串。
public class User { @NotBlank private String username; }
如果username
是null
、空字符串或者只包含空格,验证将会失败。
3. @NotEmpty
- 来源:
javax.validation.constraints.NotEmpty
- 用途: 用于集合(Collection、Map、数组等)不是
null
且size大于0,即集合不为空。 - 适用范围: 用于集合类型的字段上。
- 示例: 确保用户拥有的角色列表不为空。
public class User { @NotEmpty private List<Role> roles; }
如果roles
是null
或者列表中没有元素,验证将会失败。
4.总结区别
@NotNull
: 确保对象不是null
,但不检查空字符串或集合的空性。@NotBlank
: 确保字符串不是null
,并且去除前后的空白字符后至少包含一个字符。@NotEmpty
: 确保集合不是null
,并且至少包含一个元素。
5.使用注意事项
- 使用这些注解时,通常需要与验证框架如Hibernate Validator配合使用。
- 这些注解通常用于服务层或持久层之前的数据校验。
- 根据不同的业务需求选择合适的注解,比如对于用户输入的字符串应该使用
@NotBlank
,而对于用户角色列表则应该使用@NotEmpty
。 - 在定义实体类或者DTOs时,合理使用这些注解可以提高代码的健壮性。
6.选择注解的建议
- 如果您只需要确保字段或属性不为null,请使用@NotNull。
- 如果您需要确保字符串字段或属性不仅不为null,而且包含非空白字符,请使用@NotBlank。
- 如果您需要确保集合、数组或字符串字段或属性不仅不为null,而且不为空(对于字符串,只检查是否为空字符串),请使用@NotEmpty。