「企业级 Spring Boot 项目」的 Lombok 使用规范
·
文章目录
「企业级 Spring Boot 项目」的 Lombok 使用规范。
这套规范我在多个中大型项目里都用过,不会踩坑,也方便团队统一。
✅ 一、总体原则(先记住这 3 条)
- 所有 POJO 都必须有无参构造
- Entity 尽量不可变,DTO / VO 偏向可变
- 能用 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
永远不要手写无参构造
更多推荐



所有评论(0)