You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 04:42:16