@NotNull校验对象是否为null,适用于所有引用类型(如Integer、String、List等),但对基本类型(int、long等)无效,因其默认值非null;@NotEmpty要求非null且长度/大小>0,适用于String、集合、数组;@NotBlank仅用于String,要求非null且trim后长度>0。

Java 基本数据类型(如 int、long、double、boolean 等)本身不能直接为 null,但它们的包装类(Integer、Long、Double、Boolean)可以为 null。校验注解主要作用于**包装类型字段**,因为 @NotNull、@Min 这类注解在运行时是通过反射读取对象属性值进行判断的——而基本类型字段永远有默认值(如 int 默认是 0),无法表达“未传”或“缺失”的语义。
为什么基本类型字段加 @NotNull 没效果?
假设你写:
public class Order {
@NotNull
private int amount; // 编译通过,但校验永远通过
}
哪怕前端没传 amount,JSON 反序列化后它也会是 0(不是 null),@NotNull 判定为非空,校验就失效了。所以校验基本类型必须用包装类:
- 用
Integer替代int - 用
Long替代long - 用
Double替代double - 用
Boolean替代boolean
常用数值校验注解及适用类型
这些注解都支持包装类型,部分也支持基本类型(因自动装箱,实际校验的是包装后的值):
立即学习“Java免费学习笔记(深入)”;
-
@NotNull:确保不为
null(对Integer有效;对int永远 true) -
@Min(1) / @Max(100):要求值 ≥1 或 ≤100,支持
byte、short、int、long、BigInteger、BigDecimal及其包装类 -
@DecimalMin("0.01") / @DecimalMax("999.99"):支持小数精度控制,字符串形式传值,适用于
BigDecimal、Double、Float等 -
@Range(min = 1, max = 99):
@Min+@Max的组合简写,语义更清晰 -
@Positive / @PositiveOrZero / @Negative:语义化更强,比如
@Positive要求 > 0(0和负数都不行)
实际使用示例
一个合理的订单参数实体:
public class OrderRequest {
@NotNull(message = "订单金额不能为空")
@DecimalMin(value = "0.01", message = "金额不能小于 0.01 元")
private BigDecimal amount;
@NotNull
@Min(value = 1, message = "数量至少为 1")
private Integer quantity;
@NotNull
@Positive(message = "折扣率必须为正数")
private Double discountRate;
}
注意:@DecimalMin 必须用字符串(如 "0.01"),不能写成 0.01(编译报错),这是 JSR-303 规范要求。
Controller 层触发校验
别忘了在接口参数上加 @Valid 或 @Validated:
@PostMapping("/order")
public Result create(@RequestBody @Valid OrderRequest request) {
// 校验失败会抛出 MethodArgumentNotValidException
return service.create(request);
}
Spring Boot 2.3+ 默认启用校验,无需额外配置;若用老版本,需确认引入了 spring-boot-starter-validation。


















