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

Micronaut多模块Gradle项目:Bean实例化失败问题求助

Micronaut Gradle多模块应用Bean实例化异常排查与解决

问题背景

根项目finance包含:application和:main两个子项目,执行./gradlew build和./gradlew run均成功,但调用http://localhost:8080/hello接口时触发BeanInstantiationException,无法实例化com.jupemo.finance.controller.FinanceController及其依赖的UseCase Bean。

项目结构

Root project 'finance'
+--- Project ':application'
\--- Project ':main'

构建配置

根项目 build.gradle.kts

plugins {
    id("org.jetbrains.kotlin.jvm") version "1.8.22"
    id("org.jetbrains.kotlin.plugin.allopen") version "1.8.22"

}

version = "0.1"
group = "com.jupemo.finance"

repositories {
    mavenCentral()
}

subprojects {

    apply(plugin = "org.jetbrains.kotlin.jvm")
    apply(plugin = "org.jetbrains.kotlin.plugin.allopen")


    repositories {
        mavenCentral()
    }


    java {
        sourceCompatibility = JavaVersion.toVersion("17")
    }

    dependencies {
        runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin")
        runtimeOnly("org.yaml:snakeyaml")

        compileOnly("org.projectlombok:lombok:1.18.30")
        annotationProcessor("org.projectlombok:lombok:1.18.30")
    }


    tasks {
        compileKotlin {
            compilerOptions {
                jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17)
            }
        }
        compileTestKotlin {
            compilerOptions {
                jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17)
            }
        }
    }

}

:main 子项目 build.gradle.kts

plugins {
    id("com.google.devtools.ksp") version "1.8.22-1.0.11"
    id("com.github.johnrengelman.shadow") version "8.1.1"
    id("io.micronaut.application") version "4.0.4"
    id("io.micronaut.aot") version "4.0.4"
}

val kotlinVersion=project.properties.get("kotlinVersion")

dependencies {
    ksp("io.micronaut.serde:micronaut-serde-processor")
    implementation("io.micronaut.serde:micronaut-serde-jackson")
    implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}")
    runtimeOnly("ch.qos.logback:logback-classic")

    implementation("io.micronaut.kotlin:micronaut-kotlin-runtime")
    ksp("io.micronaut:micronaut-http-validation") // move to rest
    compileOnly("io.micronaut:micronaut-http-client") // move to rest
    testImplementation("io.micronaut:micronaut-http-client") // move to rest
    implementation("io.micronaut:micronaut-management")

    implementation(project(":application"))

}

application {
    mainClass.set("com.jupemo.finance.ApplicationKt")
}

graalvmNative.toolchainDetection.set(false)
micronaut {
    runtime("netty")
    testRuntime("junit5")
    processing {
        incremental(true)
        annotations("com.jupemo.*")
    }
    aot {
    // Please review carefully the optimizations enabled below
    // Check https://micronaut-projects.github.io/micronaut-aot/latest/guide/ for more details
        optimizeServiceLoading.set(false)
        convertYamlToJava.set(false)
        precomputeOperations.set(true)
        cacheEnvironment.set(true)
        optimizeClassLoading.set(true)
        deduceEnvironment.set(true)
        optimizeNetty.set(true)
    }
}

:application 子项目 build.gradle.kts

plugins {
    id("io.micronaut.library") version "4.0.4"
}

报错信息

Message: com.jupemo.finance.controller.FinanceController
Path Taken: new FinanceController(UseCase useCase)
io.micronaut.context.exceptions.BeanInstantiationException: Error instantiating bean of type  [com.jupemo.finance.controller.FinanceController]

Message: com.jupemo.finance.controller.FinanceController
Path Taken: new FinanceController(UseCase useCase)
        at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2322)
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2277)
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2289)
        at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3056)
        at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:81)
        at io.micronaut.context.DefaultBeanContext.findOrCreateSingletonBeanRegistratio
...
Caused by: java.lang.InstantiationError: com.jupemo.finance.controller.FinanceController
        at com.jupemo.finance.controller.$FinanceController$Definition.instantiate(Unknown Source)
        at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2307)
        ... 80 common frames omitted

解决方案

1. 补全库模块的注解处理器配置

Micronaut依赖KSP生成Bean定义元数据,:application作为库模块未配置相关处理器,导致内部Bean无法被上下文识别。修改:application的build.gradle.kts:

plugins {
    id("io.micronaut.library") version "4.0.4"
    id("com.google.devtools.ksp") version "1.8.22-1.0.11"
}

dependencies {
    ksp("io.micronaut:micronaut-inject-java")
    ksp("io.micronaut:micronaut-validation")
}

micronaut {
    processing {
        incremental(true)
        annotations("com.jupemo.*")
    }
}

2. 检查Bean的注解配置

  • 确保UseCase类添加@Singleton或@Prototype等Micronaut作用域注解
  • 确认FinanceController添加@Controller注解,构造函数的UseCase参数无需手动实例化

3. 清理并重新构建

执行命令清理缓存并重新构建项目:

./gradlew clean build run

原因分析

核心问题是:application库模块未配置KSP和Micronaut注解处理器,导致模块内Bean无法生成元数据类,:main模块启动时上下文无法识别这些依赖Bean,最终触发实例化异常。

内容的提问来源于stack exchange,提问作者juan pedro molina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 09:48:16