Micronaut+Kotlin集成MongoDB时DataCodecRegistryBuilder实例化报错求助
Micronaut + Kotlin + MongoDB Bean实例化错误问题排查
我用Micronaut和Kotlin开发微服务,服务连接EventStore监听事件,再把事件存储到本地MongoDB,MongoDB通过Helm包作为依赖集成。近期把所有事件包抽取到核心依赖后,其中一个微服务运行正常,但另一个出现以下堆栈错误:
java.lang.RuntimeException: Error instantiating bean of type [io.micronaut.data.mongodb.serde.DataCodecRegistryBuilder] Message: 'void io.micronaut.serde.support.serializers.ObjectSerializer.<init>(io.micronaut.serde.SerdeIntrospections, io.micronaut.serde.config.SerializationConfiguration, io.micronaut.context.BeanContext)' Path Taken: MongoDatabaseNameProviderFactory.namedMongoDatabaseNameProvider(NamedMongoConfiguration mongoConfiguration,String server,BeanContext beanContext,RuntimeEntityRegistry runtimeEntityRegistry,SchemaTenantResolver tenantResolver) --> MongoDatabaseNameProviderFactory.namedMongoDatabaseNameProvider([NamedMongoConfiguration mongoConfiguration],String server,BeanContext beanContext,RuntimeEntityRegistry runtimeEntityRegistry,SchemaTenantResolver tenantResolver) --> NamedMongoConfiguration.setCodecRegistryBuilder([CodecRegistryBuilder codecRegistryBuilder]) --> new DataCodecRegistryBuilder(Environment environment,[DataSerdeRegistry dataSerdeRegistry],RuntimeEntityRegistry runtimeEntityRegistry)
以下是当前微服务build.gradle.kts的依赖节选:
plugins { id("org.jetbrains.kotlin.jvm") version "1.9.22" id("org.jetbrains.kotlin.kapt") version "1.9.22" id("org.jetbrains.kotlin.plugin.allopen") version "1.9.22" id("com.github.johnrengelman.shadow") version "8.1.1" id("io.micronaut.application") version "4.3.4" id("io.micronaut.test-resources") version "4.3.4" id("com.google.cloud.tools.jib") version "3.4.0" id("io.micronaut.aot") version "4.3.4" id("org.sonarqube") version "4.3.1.3277" id("jacoco") } dependencies { api("com.perso.core:business-logic:0.0.23") api("com.perso.core:adapters:0.0.23") kapt("io.micronaut:micronaut-http-validation") kapt("io.micronaut.openapi:micronaut-openapi") kapt("io.micronaut.serde:micronaut-serde-processor") kapt("io.micronaut.validation:micronaut-validation-processor") kapt("io.micronaut.data:micronaut-data-document-processor") implementation("io.micrometer:context-propagation") implementation("io.micronaut.kotlin:micronaut-kotlin-extension-functions") implementation("io.micronaut.kotlin:micronaut-kotlin-runtime") implementation("io.micronaut.reactor:micronaut-reactor") implementation("io.micronaut.serde:micronaut-serde-jackson") implementation("io.micronaut.validation:micronaut-validation") implementation("io.micronaut.data:micronaut-data-mongodb") implementation("org.springframework:spring-core:6.1.3") implementation("jakarta.validation:jakarta.validation-api") implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor") implementation("io.projectreactor.kotlin:reactor-kotlin-extensions") implementation("com.eventstore:db-client-java:4.3.0") implementation("io.micronaut:micronaut-management") compileOnly("io.micronaut:micronaut-http-client") compileOnly("io.micronaut.openapi:micronaut-openapi-annotations") runtimeOnly("ch.qos.logback:logback-classic") runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin") runtimeOnly("org.yaml:snakeyaml") runtimeOnly("org.mongodb:mongodb-driver-reactivestreams") testImplementation("org.junit.jupiter:junit-jupiter-params") testImplementation("io.micronaut:micronaut-http-client") testImplementation("org.hamcrest:hamcrest") testImplementation("io.mockk:mockk") testImplementation("io.micronaut.testresources:micronaut-test-resources-extensions-junit-platform") }
核心库中的所有事件都标注了@Serdeable注解,当前微服务中需要映射的模型也同时标注了@Introspected和@Serdeable注解。
可能的解决方向
- 版本兼容性检查:确认Micronaut Data MongoDB与Micronaut Serde的版本是否严格匹配。Micronaut 4.x对Serde组件的版本依赖要求高,版本不一致会导致构造函数签名不匹配(错误中
ObjectSerializer的构造函数问题就是典型表现)。 - 依赖冲突排查:执行
./gradlew dependencies分析依赖树,查看是否有不同版本的Micronaut Serde或Data组件被间接引入。重点排查核心依赖com.perso.core:*带来的冲突,确保所有模块使用统一的Micronaut相关版本。 - 核心库的Serde处理器配置:如果核心库中的
@Serdeable注解未被正确处理,需要在核心库的构建脚本中添加micronaut-serde-processor的kapt依赖,确保注解处理器生成必要的序列化代码。 - 临时禁用AOT验证:当前启用了Micronaut AOT插件,AOT编译可能提前优化Bean构造逻辑,尝试临时禁用AOT插件,验证是否能正常启动,排除AOT配置导致的问题。
- MongoDB配置一致性检查:对比两个微服务的
application.yml/application.properties中MongoDB相关配置,尤其是CodecRegistry的自定义配置,避免因配置差异导致Bean实例化失败。
内容的提问来源于stack exchange,提问作者Nicolas Breels
相关产品推荐
相关产品推荐

