Java 中 Jakarta NotNull与Lombok NonNull区别

jakarta.validation.constraints.NotNull 和 lombok.NonNull 是两种用途不同的注解,主要区别如下:

1. 来源与目的

  • @NotNull (Jakarta Validation)
    属于 Jakarta Bean Validation 规范的一部分,用于通用的数据验证(如请求参数、字段值等)。
    通常与框架(如 Spring、Hibernate Validator)结合使用,在运行时验证数据合法性。

  • @NonNull (Lombok)
    是 Lombok 库的注解,旨在通过代码生成减少样板代码。
    在编译时为字段、方法参数等生成非空检查代码,若检测到 null 则立即抛出 NullPointerException


2. 触发时机与机制

  • @NotNull
    运行时触发,依赖验证框架(如 Spring 的 @Valid 注解)触发校验。
    例如:在 Spring MVC 中校验请求体时,若字段为 null,会抛出 MethodArgumentNotValidException

  • @NonNull
    编译时生成代码,在方法调用或对象构造时直接检查。
    例如:在构造方法中使用 @NonNull 注解参数,Lombok 会生成如下代码:

    java

    复制

    下载

    public User(@NonNull String name) {
        if (name == null) throw new NullPointerException("name is marked non-null but is null");
        this.name = name;
    }

3. 异常类型

  • @NotNull
    校验失败时抛出与验证框架相关的异常(如 ConstraintViolationException)。

  • @NonNull
    直接抛出 NullPointerException,附带描述信息(如字段名)。


4. 适用场景

  • @NotNull
    适合与外部输入校验(如 API 参数、表单提交)结合使用,尤其是需要统一错误处理时。

  • @NonNull
    适合内部代码逻辑的非空保障(如构造函数、Setter 方法),减少手动编写检查代码。


5. 集成与扩展性

  • @NotNull
    支持与其他注解(如 @Size@Email)组合使用,扩展性强。

  • @NonNull
    仅用于非空检查,功能单一,但可与 Lombok 其他注解(如 @RequiredArgsConstructor)配合简化代码。


总结表格

特性 Jakarta @NotNull Lombok @NonNull
来源 Jakarta Bean Validation 规范 Lombok 库
触发时机 运行时(验证框架触发) 编译时生成代码,调用时检查
异常类型 ConstraintViolationException 等 NullPointerException
适用场景 外部输入校验(API、表单) 内部代码逻辑的非空保障
扩展性 支持组合其他校验注解 功能单一,仅非空检查
依赖 需集成验证框架(如 Hibernate Validator) 需引入 Lombok 依赖

使用建议

  • 优先用 @NotNull:当需要与框架(如 Spring)集成进行数据校验时。

  • 优先用 @NonNull:当需要简化内部代码的非空检查逻辑时。

  • 二者可共存:若需同时生成代码检查和框架验证(但需注意避免冗余)。