Spring集成Lombok时子类免手写构造注入的注解正确使用方法
问题原因
你遇到的启动报错核心原因很明确:@SuperBuilder注解会在标注类中生成一个protected修饰的构造函数,该构造函数的唯一入参是类对应的Builder静态内部类型(也就是报错提示的OneSubService$OneSubServiceBuilder)。当你删除子类的显式构造函数后,这个Builder参数的构造函数成了子类的唯一构造函数,Spring实例化Bean时会默认选择类中唯一的构造函数尝试做依赖注入,但Spring容器中不存在Builder类型的Bean,因此抛出找不到Bean的错误。
正确实现方案
不需要手动编写任何子类构造函数,通过Lombok原生注解组合即可实现,步骤如下:
1. 父类注解配置
调整抽象父类AbstractSuperService的注解:
- 移除原有的
@AllArgsConstructor注解 - 保留
@SuperBuilder(如果不需要Builder构建实例的能力,可以直接删除该注解,逻辑更简洁) - 添加
@AllArgsConstructor(access = AccessLevel.PROTECTED)注解,为父类自身的superRepository字段生成仅子类可访问的全参构造,供子类构造调用。
父类示例代码:
import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.experimental.SuperBuilder; @SuperBuilder // 不需要Builder能力可删除该行 @AllArgsConstructor(access = AccessLevel.PROTECTED) public abstract class AbstractSuperService { protected final SuperRepository superRepository; }
2. 子类注解配置
调整两个@Service子类的注解:
- 保留原有的
@Service、@SuperBuilder注解 - 添加
@AllArgsConstructor(includeSuperFields = true)注解。该注解从Lombok 1.18.16版本开始支持,开启includeSuperFields = true后,会自动生成包含父类所有字段+当前类所有字段的public全参构造,同时自动调用父类的protected全参构造完成父类字段赋值,不需要手动编写super调用逻辑。
子类示例代码:
import lombok.AllArgsConstructor; import lombok.experimental.SuperBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service @SuperBuilder // 不需要Builder能力可删除该行 @AllArgsConstructor(includeSuperFields = true, onConstructor_ = @Autowired) public class OneSubService extends AbstractSuperService { private final OneRepository oneRepository; } // SecondSubService配置逻辑完全一致 @Service @SuperBuilder @AllArgsConstructor(includeSuperFields = true, onConstructor_ = @Autowired) public class SecondSubService extends AbstractSuperService { private final SecondRepository secondRepository; }
配置说明
- 配置完成后,每个子类会生成两个构造函数:一个是
@SuperBuilder生成的Builder入参的protected构造,另一个是@AllArgsConstructor生成的所有仓储字段入参的public构造。给public构造加上@Autowired注解后,Spring会强制选择该构造完成依赖注入,不会再尝试注入Builder类型的Bean。 - 如果有字段不需要加入构造注入,可以给对应字段添加
@AllArgsConstructor.Exclude注解,该字段就不会出现在生成的构造参数列表中。 - 如果项目使用的Lombok版本低于1.18.16,升级Lombok版本即可,目前主流Spring Boot版本默认集成的Lombok版本均满足要求。
内容的提问来源于stack exchange,提问作者wuttke
相关产品推荐
相关产品推荐

