MapStruct指定jakarta-cdi组件模型失效,依赖注入失败求助
解决MapStruct Jakarta CDI组件模型不生效问题
核心问题定位
MapStruct 1.5.x系列已原生支持jakarta-cdi组件模型,但你遇到的编译器识别为default、@Inject注入失败的问题,大概率是API与注解处理器依赖版本不匹配,或构建插件未正确配置,导致处理器未生成带Jakarta CDI注解的实现类。
具体修复步骤
1. 强制保证MapStruct依赖版本一致
必须确保mapstruct(API)和mapstruct-processor(注解处理器)的版本完全相同,避免版本差异导致处理器无法识别jakarta-cdi配置:
<!-- Maven 示例 --> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.5.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.5.Final</version> <scope>provided</scope> </dependency>
// Gradle 示例 dependencies { implementation 'org.mapstruct:mapstruct:1.5.5.Final' annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final' }
2. 正确配置构建插件(关键)
如果使用Maven的maven-compiler-plugin,需明确指定注解处理器路径,确保MapStruct处理器被优先调用:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <!-- 建议使用3.8.1及以上版本 --> <configuration> <source>17</source> <!-- 匹配项目使用的JDK版本 --> <target>17</target> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.5.Final</version> </path> <!-- 若项目使用Lombok等其他注解处理器,需一并添加到此路径下 --> </annotationProcessorPaths> </configuration> </plugin>
3. 验证生成的实现类
编译后查看target/generated-sources/annotations(Maven)或build/generated/sources/annotationProcessor/main(Gradle)下的Mapper实现类,确认类上是否自动生成了@jakarta.enterprise.context.ApplicationScoped注解。若未生成,说明处理器未生效,需重新检查上述配置。
4. 版本调整备选方案
若上述配置都正确仍有问题,可尝试升级到MapStruct 1.5.6.Final(修复了部分Jakarta CDI相关的边缘场景bug);同时确保项目使用的Jakarta EE版本为9+(与MapStruct 1.5.x的Jakarta支持兼容)。
额外注意事项
- 无需在Mapper接口上手动添加
@ApplicationScoped,jakarta-cdi模型下MapStruct处理器会自动为实现类注入该注解 - 构造函数注入正常是因为
default模型生成的实现类带无参构造,容器可直接实例化,但不属于CDI托管bean,因此@Inject会触发依赖不满足错误
内容的提问来源于stack exchange,提问作者idronick
相关产品推荐
相关产品推荐

