应自定义@NotBlankOrNull注解,因其可同时校验null值和空白字符串(如""、" "),而原生@NotNull仅判null,无法拦截无意义的空白字符串。

想在实体类字段上用 @NotNull,但又不满足于 Spring Boot 默认的空字符串放行行为?比如你希望“只含空格的字符串”也被判定为非法——那就得自定义一个真正语义严格的 @NotNull 校验注解。
为什么默认 @NotNull 不够用?
Spring 的 @NotNull(来自 javax.validation.constraints.NotNull)只判断对象是否为 null,对 "" 或 " " 这类非空但无意义的字符串完全不拦截。实际业务中,这类“假非空”值往往要和 null 一视同仁地拒绝。
自定义 @NotBlankOrNull 注解(推荐名)
我们不覆盖原生 @NotNull,而是新建一个更明确语义的注解,兼顾 null 和空白字符串校验:
- 创建注解接口,标注
@Constraint(validatedBy = BlankOrNullValidator.class) - 指定
message、groups、payload等标准属性 - 注意添加
@Target({FIELD, PARAMETER})和@Retention(RUNTIME)
实现对应的校验器 BlankOrNullValidator
继承 ConstraintValidator<NotBlankOrNull, String>,重写 isValid 方法:
- 先判
null→ 直接返回false - 再用
StringUtils.isBlank(str)(Apache Commons Lang)或str == null || str.trim().isEmpty()判空白 - 其他情况返回
true - 确保该类被 Spring 扫描到(加
@Component或手动注册)
在实体类中使用并触发校验
把新注解加到字段上,再配合 Spring MVC 的自动校验机制即可生效:
- Controller 方法参数加
@Valid或@Validated - 方法签名示例:
public Result save(@Valid @RequestBody User user) - 校验失败时会抛出
MethodArgumentNotValidException,建议全局异常处理器统一捕获并返回友好提示
不复杂但容易忽略:别忘了在 pom.xml 中引入 spring-boot-starter-validation,且确保你的字符串工具类(如 org.apache.commons.lang3.StringUtils)已就位。

















