无法注入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
相关产品推荐
相关产品推荐

