Micronaut Kotlin测试启动失败:无法注入jacksonConfiguration参数
Micronaut Kotlin项目测试启动失败:缺失JsonConfiguration Bean
问题现象
运行Micronaut Kotlin项目测试时,服务器启动失败,报错无法为io.micronaut.http.server.exceptions.response.HateoasErrorResponseProcessor的jacksonConfiguration参数注入值,提示不存在io.micronaut.json.JsonConfiguration类型的Bean。已尝试添加micronaut-inject-java注解处理器但无效,同时不清楚如何启用跟踪日志。
错误日志
[36m18:51:02.603[0;39m [1;30m[main][0;39m [1;31mERROR[0;39m [35mio.micronaut.runtime.Micronaut[0;39m - Error starting Micronaut server: Failed to inject value for parameter [jacksonConfiguration] of class: io.micronaut.http.server.exceptions.response.HateoasErrorResponseProcessor Message: No bean of type [io.micronaut.json.JsonConfiguration] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor). Path Taken: NettyEmbeddedServer.buildDefaultServer(NettyHttpServerConfiguration configuration) ---> new DefaultNettyEmbeddedServerFactory(ApplicationContext applicationContext,[RouteExecutor routeExecutor],MediaTypeCodecRegistry mediaTypeCodecRegistry,StaticResourceResolver staticResourceResolver,ThreadFactory nettyThreadFactory,HttpCompressionStrategy httpCompressionStrategy,EventLoopGroupFactory eventLoopGroupFactory,EventLoopGroupRegistry eventLoopGroupRegistry) ---> new RouteExecutor(Router router,BeanContext beanContext,RequestArgumentSatisfier requestArgumentSatisfier,HttpServerConfiguration serverConfiguration,[ErrorResponseProcessor errorResponseProcessor],ExecutorSelector executorSelector) ---> new HateoasErrorResponseProcessor([JsonConfiguration jacksonConfiguration]) io.micronaut.context.exceptions.DependencyInjectionException: Failed to inject value for parameter [jacksonConfiguration] of class: io.micronaut.http.server.exceptions.response.HateoasErrorResponseProcessor Message: No bean of type [io.micronaut.json.JsonConfiguration] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor). Path Taken: NettyEmbeddedServer.buildDefaultServer(NettyHttpServerConfiguration configuration) ---> new DefaultNettyEmbeddedServerFactory(ApplicationContext applicationContext,[RouteExecutor routeExecutor],MediaTypeCodecRegistry mediaTypeCodecRegistry,StaticResourceResolver staticResourceResolver,ThreadFactory nettyThreadFactory,HttpCompressionStrategy httpCompressionStrategy,EventLoopGroupFactory eventLoopGroupFactory,EventLoopGroupRegistry eventLoopGroupRegistry) ---> new RouteExecutor(Router router,BeanContext beanContext,RequestArgumentSatisfier requestArgumentSatisfier,HttpServerConfiguration serverConfiguration,[ErrorResponseProcessor errorResponseProcessor],ExecutorSelector executorSelector) ---> new HateoasErrorResponseProcessor([JsonConfiguration jacksonConfiguration]) at io.micronaut.context.AbstractInitializableBeanDefinition.resolveBean(AbstractInitializableBeanDefinition.java:2087) at io.micronaut.context.AbstractInitializableBeanDefinition.getBeanForConstructorArgument(AbstractInitializableBeanDefinition.java:1297) at io.micronaut.http.server.exceptions.response.$HateoasErrorResponseProcessor$Definition.build(Unknown Source) at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2354) at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2305) at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2251) at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3016) at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80) at io.micronaut.context.DefaultBeanContext.findOrCreateSingletonBeanRegistration(DefaultBeanContext.java:2918) at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2879) at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2800) at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1617) at io.micronaut.context.AbstractBeanResolutionContext.getBean(AbstractBeanResolutionContext.java:66) at io.micronaut.context.AbstractInitializableBeanDefinition.resolveBean(AbstractInitializableBeanDefinition.java:2065) at io.micronaut.context.AbstractInitializableBeanDefinition.getBeanForConstructorArgument(AbstractInitializableBeanDefinition.java:1297) at io.micronaut.http.server.$RouteExecutor$Definition.build(Unknown Source) at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2354) at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2305) at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2251) at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3016) at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80) at io.micronaut.context.DefaultBeanContext.findOrCreateSingletonBeanRegistration(DefaultBeanContext.java:2918) at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2879) at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2800) at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1617) at io.micronaut.context.AbstractBeanResolutionContext.getBean(AbstractBeanResolutionContext.java:66) at io.micronaut.context.AbstractInitializableBeanDefinition.resolveBean(AbstractInitializableBeanDefinition.java:2065) at io.micronaut.context.AbstractInitializableBeanDefinition.getBeanForConstructorArgument(AbstractInitializableBeanDefinition.java:1297) at io.micronaut.http.server.netty.$DefaultNettyEmbeddedServerFactory$Definition.build(Unknown Source) at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2354) at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2305) at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2251) at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3016) at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80) at io.micronaut.context.DefaultBeanContext.findOrCreateSingletonBeanRegistration(DefaultBeanContext.java:2918) at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2879) at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2800) at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1617) at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1599) at io.micronaut.http.server.netty.$DefaultNettyEmbeddedServerFactory$BuildDefaultServer0$Definition.build(Unknown Source) at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2354) at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2305) at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2251) at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3016) at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80) at io.micronaut.context.DefaultBeanContext.findOrCreateSingletonBeanRegistration(DefaultBeanContext.java:2918) at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2879) at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2800) at io.micronaut.context.DefaultBeanContext.findBean(DefaultBeanContext.java:1680) at io.micronaut.context.DefaultBeanContext.findBean(DefaultBeanContext.java:1655) at io.micronaut.context.DefaultBeanContext.findBean(DefaultBeanContext.java:878) at io.micronaut.context.BeanLocator.findBean(BeanLocator.java:291) at io.micronaut.runtime.Micronaut.start(Micronaut.java:77) at io.micronaut.runtime.Micronaut.run(Micronaut.java:323) at io.micronaut.runtime.Micronaut.run(Micronaut.java:309) at io.micronaut.testresources.server.Application.main(Application.java:41) Caused by: io.micronaut.context.exceptions.NoSuchBeanException: No bean of type [io.micronaut.json.JsonConfiguration] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor). at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2805) at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1617) at io.micronaut.context.AbstractBeanResolutionContext.getBean(AbstractBeanResolutionContext.java:66) at io.micronaut.context.AbstractInitializableBeanDefinition.resolveBean(AbstractInitializableBeanDefinition.java:2065) ... 55 common frames omitted
测试代码
@MicronautTest class VocabSatBackendTest { // @Inject // var userInfoService: UserInfoService? = null @Test fun test() { // val userInfo = userInfoService!!.getUserByToken(1345L) // println(userInfo.firstName) println('e') } }
build.gradle.kts配置
plugins { id("org.jetbrains.kotlin.jvm") version "1.6.21" id("org.jetbrains.kotlin.kapt") version "1.6.21" id("org.jetbrains.kotlin.plugin.allopen") version "1.6.21" id("com.github.johnrengelman.shadow") version "7.1.2" id("io.micronaut.application") version "3.6.7" id("io.micronaut.test-resources") version "3.6.7" } version = "0.1" group = "com.example" val kotlinVersion = project.properties.get("kotlinVersion") repositories { mavenCentral() } dependencies { kapt("io.micronaut:micronaut-http-validation") implementation("io.micronaut:micronaut-http-client") implementation("io.micronaut:micronaut-jackson-databind") implementation("io.micronaut.kotlin:micronaut-kotlin-runtime") implementation("io.micronaut.sql:micronaut-jdbc-hikari") implementation("jakarta.annotation:jakarta.annotation-api") implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}") runtimeOnly("ch.qos.logback:logback-classic") runtimeOnly("org.mariadb.jdbc:mariadb-java-client") implementation("io.micronaut:micronaut-validation") annotationProcessor("io.micronaut.serde:micronaut-serde-processor:2.0.0-SNAPSHOT") annotationProcessor("io.micronaut.data:micronaut-data-processor") runtimeOnly("io.micronaut.flyway:micronaut-flyway:5.4.1") runtimeOnly("org.flywaydb:flyway-mysql:9.10.2") compileOnly("jakarta.persistence:jakarta.persistence-api:3.1.0") runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin") kapt("io.micronaut.data:micronaut-data-processor") implementation("io.micronaut.data:micronaut-data-jdbc") runtimeOnly("com.h2database:h2") testImplementation("org.junit.jupiter:junit-jupiter-api") testImplementation("io.micronaut.test:micronaut-test-junit5:3.8.0") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.9.2") testImplementation("org.junit.jupiter:junit-jupiter-engine:5.9.2") runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin") configurations.all { resolutionStrategy.dependencySubstitution { substitute(module("io.micronaut:micronaut-jackson-databind")) .using(module("io.micronaut.serde:micronaut-serde-jackson:1.0.1")) } } } application { mainClass.set("com.example.ApplicationKt") } java { sourceCompatibility = JavaVersion.toVersion("17") } tasks { compileKotlin { kotlinOptions { jvmTarget = "17" } } compileTestKotlin { kotlinOptions { jvmTarget = "17" } } test { useJUnitPlatform() } } graalvmNative.toolchainDetection.set(false) micronaut { runtime("netty") testRuntime("junit5") processing { incremental(true) annotations("com.example.*") } testResources { additionalModules.add("jdbc-mariadb") } }
解决方案
1. 修复Serde依赖版本不匹配
配置中micronaut-serde-processor使用了2.0.0-SNAPSHOT,但micronaut-serde-jackson是1.0.1,版本不一致会引发依赖冲突。将处理器版本改为与jackson实现一致:
annotationProcessor("io.micronaut.serde:micronaut-serde-processor:1.0.1")
2. 添加缺失的Micronaut Json依赖
JsonConfiguration属于micronaut-json模块,当前依赖中未引入,需添加:
implementation("io.micronaut:micronaut-json")
3. 启用跟踪日志排查Bean加载问题
在src/test/resources/logback-test.xml中添加以下配置,开启io.micronaut.context.condition的TRACE级别日志:
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <logger name="io.micronaut.context.condition" level="TRACE"/> <root level="INFO"> <appender-ref ref="STDOUT"/> </root> </configuration>
4. 清理缓存并重新构建
执行命令清理项目缓存后重新构建测试:
./gradlew clean build test
内容的提问来源于stack exchange,提问作者Ishaan Goyal
相关产品推荐
相关产品推荐

