Spring Boot M7集成MongoDB时ReflectKotlinClass缺失问题咨询
这个问题我之前处理过,核心原因是Kotlin 1.2.21版本的内部反射组件结构变动,而你使用的Spring Boot 2.0.0.M7版本的Spring Data MongoDB并未适配这个变动,导致加载带@Document注解的Kotlin实体类时找不到指定的内部反射类。
为什么会出现这个错误?
你提到已经引入了kotlin-reflect,但缺失的kotlin/reflect/jvm/internal/impl/load/kotlin/reflect/ReflectKotlinClass并不属于对外的kotlin-reflect模块,而是属于Kotlin编译器的内部嵌入模块kotlin-compiler-embeddable。Spring Data MongoDB在处理Kotlin数据类/实体类时,会依赖这个内部模块来解析类的元数据,当你升级Kotlin版本后,这个模块没有被自动引入,就会抛出NoClassDefFoundError。
解决方法
这里提供两种靠谱的解决方案:
方案1:手动添加kotlin-compiler-embeddable依赖
在你的构建配置中加入这个依赖,版本和你使用的Kotlin版本保持一致(1.2.21):
- Maven(pom.xml):
<dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-compiler-embeddable</artifactId> <version>1.2.21</version> </dependency>
- Gradle(build.gradle):
implementation "org.jetbrains.kotlin:kotlin-compiler-embeddable:1.2.21"
添加后重新构建项目,Spring Data MongoDB就能找到所需的内部反射类,带@Document注解的实体类也能正常加载了。
方案2:升级Spring Boot到稳定版本
Spring Boot 2.0.0.M7是一个里程碑版本,后续的正式版(比如2.0.0.RELEASE及以上)已经适配了更高版本的Kotlin,包括1.2.21。升级Spring Boot版本不仅能解决这个问题,还能获取更多bug修复和稳定性提升。
额外建议
尽量遵循Spring Boot官方的版本兼容性矩阵,确保Kotlin版本和Spring Boot版本匹配,这样能避免很多类似的依赖冲突或类缺失问题。
内容的提问来源于stack exchange,提问作者Gregor

