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

继承MicronautRequestHandler的Bean实例化时出现递归循环BeanInstantiationException问题求助

继承MicronautRequestHandler的Bean实例化时出现递归循环BeanInstantiationException问题求助

各位好,我最近碰到了一个很棘手的问题:当我尝试初始化一个继承自MicronautRequestHandler的Bean时,会陷入递归循环,抛出BeanInstantiationException,但其他普通的Bean却完全没有这个问题。折腾了好几个Micronaut版本都没解决,想请大家帮忙看看。

先说说我的环境信息:

  • Java版本:17
  • Micronaut版本:试过3.10.0、4.1.0,最后甚至用全新项目试了4.4.2,都出现相同问题

我把Handler类简化到了极致,甚至去掉了所有注入的服务,只保留最基础的结构,代码如下:

package org.example;

import com.amazonaws.services.lambda.runtime.events.S3Event;
import io.micronaut.function.aws.MicronautRequestHandler;
import jakarta.inject.Inject;
import jakarta.inject.Singleton;

@Singleton
public class Handler extends MicronautRequestHandler<S3Event, Void> {

    @Inject
    public Handler() {
        // 空实现
    }

    @Override
    public Void execute(S3Event input) {
        System.out.println("Received S3 event: " + input);
        return null;
    }
}

为了不用Lambda本地复现这个问题,我写了一个极简的LocalRunner类,运行它还是会触发错误:

package org.example;

import io.micronaut.context.ApplicationContext;

public class LocalRunner {
    public static void main(String[] args) {
        // 启动Micronaut应用上下文
        try (ApplicationContext context = ApplicationContext.run()) {
            // 获取Handler的Bean实例
            Handler handler = context.getBean(Handler.class);
        }
    }
}

部署到Lambda上用S3Event触发时,也会出现完全一样的错误。

我的build.gradle依赖配置如下:

plugins {
    id("application")
}

version = "0.1"
group = "org.example"

repositories {
    mavenCentral()
    maven { url "https://s01.oss.sonatype.org/content/repositories/releases/" }
}

dependencies {
    annotationProcessor("io.micronaut:micronaut-http-validation:3.10.0")
    annotationProcessor("io.micronaut:micronaut-inject-java:3.10.0")
    implementation('io.micronaut.aws:micronaut-function-aws:3.18.0')
    implementation("io.micronaut:micronaut-inject:3.10.0")
    implementation("io.micronaut:micronaut-http-server-netty:3.10.0")
    implementation("io.micronaut:micronaut-json-core:3.10.0")
    implementation("io.micronaut:micronaut-jackson-databind:3.10.0")
    implementation("jakarta.inject:jakarta.inject-api:2.0.1")
    implementation("com.amazonaws:aws-lambda-java-events:3.11.0")
    implementation("software.amazon.awssdk:s3:2.29.0")
    implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.16.0")
    implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.16.0")

    // SLF4J相关
    implementation 'org.slf4j:slf4j-api:1.2.13'
    runtimeOnly("org.apache.logging.log4j:log4j-to-slf4j:2.18.0") 

    // JDBC相关
    implementation 'com.amazon.redshift:redshift-jdbc42:2.1.0.9'
    implementation 'commons-dbcp:commons-dbcp:1.4'
}
configurations {
    all*.exclude group: 'ch.qos.logback'
    all*.exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j'
}
java {
    sourceCompatibility = JavaVersion.toVersion("17")
    targetCompatibility = JavaVersion.toVersion("17")
}

错误日志的核心片段(会重复很多次)如下,能明显看到程序陷入了递归循环,一直在重复调用Handler的构造器:

Path Taken: new Handler()
    ... 1024 more
Caused by: io.micronaut.context.exceptions.BeanInstantiationException: Bean 
definition [org.example.Handler] could not be loaded:

//...

    at org.example.Handler.<init>(Handler.java:12)
    at org.example.$Handler$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.loadContextScopeBean(DefaultBeanContext.java:2746)
    at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:1915)
    at io.micronaut.context.DefaultApplicationContext.initializeContext(DefaultApplicationContext.java:249)
    at io.micronaut.context.DefaultBeanContext.readAllBeanDefinitionClasses(DefaultBeanContext.java:3326)
    at io.micronaut.context.DefaultBeanContext.finalizeConfiguration(DefaultBeanContext.java:3684)
    at io.micronaut.context.DefaultBeanContext.start(DefaultBeanContext.java:341)
    at io.micronaut.context.DefaultApplicationContext.start(DefaultApplicationContext.java:194)
    at io.micronaut.function.executor.AbstractExecutor.startEnvironment(AbstractExecutor.java:124)
    at io.micronaut.function.aws.MicronautRequestHandler.buildApplicationContext(MicronautRequestHandler.java:222)
    at io.micronaut.function.aws.MicronautRequestHandler.<init>(MicronautRequestHandler.java:108)
    at org.example.Handler.<init>(Handler.java:12)
    // 后续重复上述调用栈,陷入无限循环

可以看到resolveByBeanFactory()一直在尝试初始化Handler的构造器,导致无限递归。


UPDATE

我甚至用全新的IntelliJ Micronaut默认项目(Java17,Micronaut4.4.2)只需要3步就能复现这个问题:

  1. 在build.gradle里添加这两个依赖:
implementation('io.micronaut.aws:micronaut-function-aws')
implementation("com.amazonaws:aws-lambda-java-events:3.11.0")
  1. 添加上面提到的那个简化版Handler类
  2. 在Application类的main方法里添加这两行代码:
try (ApplicationContext context = ApplicationContext.run()) {
    Handler handler = context.getBean(Handler.class);
}

这样运行Application的main方法就会直接触发相同的递归错误。

真心希望有人能帮我找出问题所在,谢谢大家!

备注:内容来源于stack exchange,提问作者Tharaka Deshan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 08:54:33