You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:21:36