使用Lombok 1.16搭配Dagger2遇构造器注入问题求助
我之前也踩过这个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

