@notempty是hibernate validator注解,要求对象非null且内容非空(字符串长度>0、集合size>0等),比@notnull严格、比@notblank适用范围广;需手动引入spring-boot-starter-validation依赖,不自动trim空格,不适用于基本包装类。

在 Java 中,@NotEmpty 是 Hibernate Validator 提供的校验注解,用于确保字符串、集合、数组、Map 等对象**既不为 null,且内容不为空**(比如字符串长度 > 0,集合 size > 0)。它比 @NotNull 更严格,也比 @NotBlank(仅适用于 String,还要求去除首尾空格后非空)适用范围更广。
需要添加依赖
Spring Boot 2.3+ 默认移除了 spring-boot-starter-validation 的自动依赖,需手动引入:
Maven 依赖示例:
<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-validation</artifactid></dependency>
非 Spring Boot 项目则需引入:hibernate-validator + jakarta.validation-api(注意 Jakarta EE 9+ 命名空间已从 javax.validation 升级为 jakarta.validation)。
基本用法:作用于字段或参数
直接加在实体类字段或 Controller 方法参数上即可,配合 @Valid 或 @Validated 触发校验:
- 校验字符串:
@NotEmpty要求不为null且长度 > 0(等价于str != null && !str.trim().isEmpty()不成立——它不自动 trim,只判 length > 0) - 校验集合(List/Set/Map):
@NotEmpty要求不为null且size() > 0 - 校验数组:
@NotEmpty要求不为null且length > 0
示例:
public class UserRequest {
@NotEmpty(message = "用户名不能为空")
private String username;
@NotEmpty(message = "角色列表不能为空")
private List<string> roles;
@NotEmpty(message = "标签映射不能为空")
private Map<string string> tags;
}</string></string>
Controller 中启用校验:
@PostMapping("/user")
public ResponseEntity> createUser(@Valid @RequestBody UserRequest request) {
return ResponseEntity.ok().build();
}
注意常见误区
-
@NotEmpty对String不做 trim," "(纯空格)会被认为“非空”而通过校验;如需忽略空格,应组合使用@NotBlank - 它不能校验嵌套对象内部字段,如需校验
List<address></address>中每个Address.city非空,要在Address类中对city加@NotEmpty,并在List<address></address>上加@Valid - 若字段类型是基本包装类(如
Integer)、布尔类型等,@NotEmpty不适用——它们用@NotNull更合适 - Spring MVC 默认只对
@RequestBody和@ModelAttribute参数生效;对@RequestParam或@PathVariable需配合@Validated和分组,或改用@NotBlank/@NotNull
自定义错误消息与国际化
可通过 message 属性指定提示,也支持使用属性文件实现多语言:
- 在
ValidationMessages.properties中添加:NotEmpty.userRequest.username=用户名必须填写 - 字段上写:
@NotEmpty(message = "{NotEmpty.userRequest.username}") - 确保配置了
MessageSourcebean(Spring Boot 默认已配好)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











