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

无法注入AWS Lambda Context到Micronaut函数,求上下文读取最优方案

无法将AWS Lambda上下文注入MicronautRequestHandler

用户代码示例:

public class FunctionRequestHandler extends MicronautRequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
    private Logger logger = LoggerFactory.getLogger(FunctionRequestHandler.class);

    @Inject
    private BeanProvider<Context> contextProvider;

   
    @Override
    public APIGatewayProxyResponseEvent execute(APIGatewayProxyRequestEvent input) {
        APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
        logger.info("starting...");
        logger.info("functionArn:{}", this.applicationContext.getAttributes());
        logger.info("functionArn:{}", contextProvider.get().getInvokedFunctionArn());
        response.setStatusCode(200);
        return response;
    }
}

问题:请问读取上下文信息的最佳方式是什么?

补充的错误信息:

{
  "errorMessage": "不存在类型为[com.amazonaws.services.lambda.runtime.Context]的Bean。请确保该Bean未被Bean要求禁用(可启用'io.micronaut.context.condition'的跟踪日志进行检查),若已启用则需确保该类被声明为Bean且注解处理已启用(对于Java和Kotlin,应将'micronaut-inject-java'依赖配置为注解处理器)。",
  "errorType": "io.micronaut.context.exceptions.NoSuchBeanException",
  "stackTrace": [
    "io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2805)",
    "io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1617)",
    "io.micronaut.inject.provider.BeanProviderDefinition$1.get(BeanProviderDefinition.java:81)",
    "com.example.FunctionRequestHandler.execute(FunctionRequestHandler.java:25)",
    "java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)",
    "java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)",
    "java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)",
    "java.base/java.lang.reflect.Method.invoke(Unknown Source)"
  ]
}

正确读取Lambda上下文的方式

Micronaut的MicronautRequestHandler原生提供了带Lambda上下文参数的execute方法重载,不需要通过依赖注入获取,直接重写该方法即可:

public class FunctionRequestHandler extends MicronautRequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
    private Logger logger = LoggerFactory.getLogger(FunctionRequestHandler.class);

    @Override
    public APIGatewayProxyResponseEvent execute(APIGatewayProxyRequestEvent input, Context context) {
        APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
        logger.info("starting...");
        logger.info("functionArn:{}", context.getInvokedFunctionArn());
        response.setStatusCode(200);
        return response;
    }
}

原方式报错原因

com.amazonaws.services.lambda.runtime.Context并非Micronaut容器管理的Bean,因此无法通过@Inject或BeanProvider获取。Lambda运行时会在调用函数时直接传递该上下文对象,所以使用双参数的execute方法是标准做法。

非Handler类中获取上下文的方式

如果需要在其他Bean中访问Lambda上下文,可以使用Micronaut提供的LambdaContextBean,它会自动绑定运行时上下文信息:

import io.micronaut.function.aws.runtime.LambdaContext;

@Singleton
public class SomeService {
    private final LambdaContext lambdaContext;

    public SomeService(LambdaContext lambdaContext) {
        this.lambdaContext = lambdaContext;
    }

    public void doSomething() {
        String functionArn = lambdaContext.getInvokedFunctionArn();
        // 业务逻辑中使用上下文信息
    }
}

内容的提问来源于stack exchange,提问作者datagrid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:44:13