「企业级 Spring Boot 项目」的 Lombok 使用规范
这套规范我在多个中大型项目里都用过,不会踩坑,也方便团队统一


✅ 一、总体原则(先记住这 3 条)

  1. 所有 POJO 都必须有无参构造
  2. Entity 尽量不可变,DTO / VO 偏向可变
  3. 能用 Lombok,就不要手写构造器 / getter / setter

✅ 二、各层对象的推荐注解模板

1️⃣ DTO(入参 / 表单对象)

✅ 标准写法(90% 情况)

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ArticleCreateDTO {

    @NotBlank
    private String title;

    @NotNull
    private Long authorId;
}

✅ 什么时候用 @Builder

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ArticleCreateDTO {
}

📌 适合:

  • 测试代码
  • 复杂对象构造
  • 可选参数多的场景

2️⃣ VO(返回给前端)

✅ 推荐写法

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ArticleDetailVO {

    private Long id;
    private String title;
    private String authorName;
}

VO 永远不要暴露 Entity
VO 不加业务行为,只做展示


3️⃣ Entity / DO(数据库对象)

✅ JPA Entity(推荐)

@Entity
@Table(name = "article")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Article {

    @Id
    @GeneratedValue
    private Long id;

    private String title;
    private String content;
}

✅ MyBatis Entity(简化版)

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ArticleDO {
    private Long id;
    private String title;
}

⚠️ Entity 不建议用 @Builder 单独存在
(容易破坏 JPA / MyBatis 的默认行为)


4️⃣ Query / PageQuery(查询条件)

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ArticlePageQuery {

    private Integer pageNum = 1;
    private Integer pageSize = 10;

    private String keyword;
}

✅ 永远给分页参数默认值


5️⃣ 枚举(Enum)

@Getter
@AllArgsConstructor
public enum ArticleStatus {

    DRAFT(0, "草稿"),
    PUBLISHED(1, "已发布");

    private final int code;
    private final String desc;
}

❌ 不要用 @Data(会生成无用的 setter)


6️⃣ 工具类 / 常量类

@UtilityClass
public class ArticleConstants {
    public static final int MAX_TITLE_LENGTH = 100;
}

✅ 自动私有构造
✅ 防止被实例化


✅ 三、严格禁止的用法(非常重要)

不要在 Entity 上这样用

@Data
@Builder
public class ArticleEntity {
}

不要省略 @NoArgsConstructor

@Data
@AllArgsConstructor
public class XXXDTO {
}

不要用 @EqualsAndHashCode 默认实现在 Entity 上

@EqualsAndHashCode(callSuper = false)

✅ 四、Serializable 与 Lombok 的组合建议

场景是否加 Serializable
DTO❌ 不加
VO❌ 不加
Entity✅ 视缓存而定
Redis(JDK)✅ 必须

✅ 如果加:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ArticleCacheDTO implements Serializable {
    private static final long serialVersionUID = 1L;
}

✅ 五、团队统一 Check 清单 ✅

✅ 是否每个 POJO 都有 @NoArgsConstructor
✅ 是否 DTO / VO 不写业务逻辑
✅ 是否 Entity 不直接返回给前端
✅ 是否枚举只用 @Getter
✅ 是否工具类用 @UtilityClass


✅ 六、一句话终极规范(直接贴到 Wiki)

DTO / VO:@Data + @NoArgsConstructor + @AllArgsConstructor
Entity:@Entity + @NoArgsConstructor + @AllArgsConstructor
Enum:@Getter + @AllArgsConstructor
工具类:@UtilityClass
永远不要手写无参构造

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐