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

使用Lombok 1.16搭配Dagger2遇构造器注入问题求助

解决Lombok 1.16搭配Dagger2时@Inject构造器不被识别的问题

我之前也踩过这个Lombok和Dagger2配合的坑,你的问题本质是Lombok生成的带@Inject注解的构造器没有被Dagger2的注解处理器正确识别。咱们一步步来解决:

问题根源

Lombok 1.16版本的onConstructor语法在处理JSR-305风格的注解(比如Dagger2的@Inject)时,存在生成逻辑的小问题,导致编译时Dagger无法检测到带有@Inject的构造器,进而抛出cannot be provided without an @Inject constructor的错误。而手动编写构造器时,注解位置完全符合Dagger的要求,所以能正常工作。

解决步骤

1. 修正Lombok注解的语法

把你原来的@__(@Inject)改成@_(@Inject)——这是Lombok早期版本处理构造器注解的正确语法(双下划线是错误写法)。修正后的代码如下:

@AllArgsConstructor(onConstructor = @_(@Inject))
public class JuiceMaker {
    private final Apple apple;
}

2. 确保注解处理器配置正确

不管你用Gradle还是Maven,都要同时启用Lombok和Dagger2的注解处理器,保证两者在编译阶段都能正常工作:

  • Gradle(Groovy DSL):
    dependencies {
        implementation 'org.projectlombok:lombok:1.16.22' // 保持你当前的1.16.x版本
        annotationProcessor 'org.projectlombok:lombok:1.16.22'
        implementation 'com.google.dagger:dagger:x.y.z' // 替换成你的Dagger实际版本
        annotationProcessor 'com.google.dagger:dagger-compiler:x.y.z'
    }
    
  • Maven:
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.22</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.google.dagger</groupId>
            <artifactId>dagger</artifactId>
            <version>x.y.z</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.16.22</version>
                        </path>
                        <path>
                            <groupId>com.google.dagger</groupId>
                            <artifactId>dagger-compiler</artifactId>
                            <version>x.y.z</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

3. 升级Lombok版本(可选但推荐)

Lombok 1.16确实比较老旧,后续版本对注解处理器的兼容性做了很多优化。如果项目允许的话,建议升级到Lombok 1.18+的稳定版本,新版本中可以用更简洁的写法:

@AllArgsConstructor(onConstructor_ = @Inject)
public class JuiceMaker {
    private final Apple apple;
}

(新版本用onConstructor_替代了老版本的onConstructor+@_语法,更符合Java语法习惯)

验证

修改完成后,执行clean编译(比如./gradlew clean build或者mvn clean compile),Dagger2应该就能正确识别Lombok生成的带@Inject的构造器了。

内容的提问来源于stack exchange,提问作者Jessica

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:52:47