应使用@NotBlank而非@NotEmpty或原生判空,因其专为“非空且非纯空白”设计,可一步排除null、""及"\t\n\r"等无效字符串;@NotEmpty仅校验非null且长度>0,会错误接受纯空白字符串,导致业务异常。

直接用 @NotBlank,别用 @NotEmpty 或原生判空逻辑——前者专为“非空且非纯空白”设计,一步到位排除 null、"" 和 "\t \n\r" 等所有无效字符串。
为什么不能只用 @NotEmpty
@NotEmpty 只保证字符串不为 null 且长度 > 0,但对 " "、"\t\n" 这类含空白字符的字符串完全放行。业务上用户填一串空格和没填几乎等价,但系统会当作合法值接收,后续可能引发数据异常或逻辑绕过。
-
@NotEmpty→ 接受" "(长度为1),校验通过 -
@NotBlank→ 拒绝" "(trim 后为空),抛出校验失败
Controller 层标准写法
必须同时满足两个条件:类上加 @Validated,参数上加 @NotBlank(单个字符串)或 @NotEmpty List<@NotBlank String>(字符串列表):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 单参数:
@RequestParam @NotBlank String userName - 多值参数:
@RequestParam @NotEmpty List<@NotBlank String> roles - 注意:
@NotBlank不能直接用于集合类型,必须嵌套在泛型内
配套异常处理不能少
校验失败默认抛 ConstraintViolationException,需全局捕获并转成可读提示:
- 返回 HTTP 400 状态码
- 响应体包含具体字段名和错误信息,例如:
{"field":"userName","message":"用户名不能为空或仅含空白字符"} - 避免暴露技术细节(如约束注解名、类路径)给前端或调用方
非 Spring 场景的等效处理
若不在 Controller 层,或用其他语言,核心逻辑一致:先判 null,再 trim(),再判空:
- Java:
str != null && !str.trim().isEmpty()或直接str != null && !str.isBlank()(JDK 11+) - JavaScript:
typeof str === 'string' && str.trim() !== '' - SQL Server:
ISNULL(NULLIF(LTRIM(RTRIM(field)), ''), '') = ''或更清晰的field IS NULL OR LTRIM(RTRIM(field)) = ''

















