
Lombok 的 @Value 注解默认不生成任何构造函数(包括 @AllArgsConstructor)——只要类中存在任意显式构造函数,Lombok 就会完全跳过构造器生成;需手动添加 @AllArgsConstructor 显式启用。
lombok 的 `@value` 注解默认不生成任何构造函数(包括 `@allargsconstructor`)——只要类中存在任意显式构造函数,lombok 就会完全跳过构造器生成;需手动添加 `@allargsconstructor` 显式启用。
@Value 是 Lombok 中用于创建不可变值对象的强力注解,它隐式组合了 @Getter、@ToString、@EqualsAndHashCode、@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) 和 条件性 的 @AllArgsConstructor。关键在于“条件性”:只要类中声明了任一显式构造函数(无论参数数量或逻辑),Lombok 就会自动禁用所有构造器的自动生成,包括 @AllArgsConstructor。
这正是你遇到编译错误的根本原因:
@Value
public class Foo {
int x;
int y;
public Foo(Bar bar) { // ← 显式构造函数触发 Lombok 构造器生成机制关闭
this(bar.getA(), bar.getB()); // 编译失败:找不到匹配的 two-arg 构造器
}
}
此时 this(bar.getA(), bar.getB()) 试图调用 Foo(int, int),但该构造器并未被生成,IDE 和编译器均报错。
✅ 正确解法是显式保留所需构造器:
@Value
@AllArgsConstructor // ✅ 显式声明,强制 Lombok 生成全参构造器
public class Foo {
int x;
int y;
public Foo(Bar bar) {
this(bar.getA(), bar.getB()); // ✅ 现在可正常调用
}
}
⚠️ 注意事项:
- @AllArgsConstructor 必须直接加在类上,不能加在构造函数上;
- 若同时需要无参构造器(如 ORM 框架要求),可额外添加 @NoArgsConstructor(但注意与 @Value 的不可变语义冲突,需谨慎);
- @Value 已将所有字段设为 final 和 private,因此自定义构造函数中必须通过 this(...) 完整初始化所有字段,否则编译失败(Java final 字段未初始化检查);
- 不支持通过 lombok.config 全局配置恢复 @AllArgsConstructor 行为——这是 Lombok 的明确设计决策,而非 bug 或版本缺陷(1.18.18 及后续版本均保持此行为)。
总结:这不是配置问题,而是 Lombok 的确定性契约——显式构造函数与自动生成构造器互斥。要兼顾二者,唯一标准方案就是显式添加 @AllArgsConstructor(或 @RequiredArgsConstructor 等替代注解)。











