Lombok @With克隆时父类继承字段为null,如何配置才能正常工作?
Lombok @With注解继承父类字段为空问题解决
问题根因
@With注解的默认工作逻辑决定了该问题的出现:
@With生成的字段修改方法,会调用当前类的全参构造器实例化新对象,默认仅会复制当前类定义的字段值,不会主动处理父类继承的字段- 你给
Employee类添加的@AllArgsConstructor注解,仅会生成包含子类自有字段id的构造方法,调用withId生成新对象时,只会给新对象的id字段赋值,父类的name、age字段没有被传递赋值,因此返回null。
兼容说明
这种子类继承父类字段的场景,Lombok @With 原生默认不支持,需要调整代码适配。
修复方案
方案1:手动定义包含父类字段的全参构造(首选,兼容性最高)
删除Employee类上的@AllArgsConstructor注解,手动编写包含父类字段的全参构造,同时将@Builder注解加在该构造方法上,@With会自动识别该构造方法完成所有字段的复制:
@NoArgsConstructor @With @Getter class Employee extends Person { protected String id; // 手动编写包含父类字段的全参构造,同时承载Builder逻辑 @Builder public Employee(String name, Integer age, String id) { super(name, age); this.id = id; } }
调整后调用withId方法时,会自动把原对象的name、age、原有id传入构造器,仅替换你指定的新id值,父类字段就不会再为空。
方案2:高版本Lombok适配(Lombok 1.18.24及以上版本支持)
如果项目允许升级Lombok版本,可以给父类和子类都添加@SuperBuilder注解,配合@With使用,同时删除子类上的@AllArgsConstructor注解,也可以实现父类字段的自动复制。
内容的提问来源于stack exchange,提问作者Psycho Punch
相关产品推荐
相关产品推荐

