java - 为 Jersey 资源提供 lambda 上下文

标签 java dependency-injection aws-lambda jersey

我正在使用 aws-serverless-java-container在 AWS Lambda 中包装 Jersey 服务。我决定使用函数别名来拥有一个“测试”和“生产”阶段,最终指向不同版本的 lambda 函数。

我需要根据该别名在 .properties 文件中选择一些属性,主要是因为我需要与“测试”或“生产”数据库对话或使用不同的端点来调用外部 Web 服务。

为此,我需要调用 Context object 的 getInvokedFunctionArn 方法.不幸的是,Jersey 资源在默认情况下并不知道这种上下文。

示例资源下方:

@Path("/pet")
public class PetResource {

    @POST
    @Path("/")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.WILDCARD)
    public Response createPet() {
        // how to call getInvokedFunctionArn from Lambda context object?
        return Response.status(200).entity("{'result': 'success'}").build();
    }
}

如何使 Jersey 资源具有调用的 ARN?可以注入(inject)吗?

lambda 处理程序定义为:

public class PetLambdaHandler implements RequestStreamHandler {

    private static final ResourceConfig jerseyApplication = new ResourceConfig().register(PetResource.class)
            .register(JacksonFeature.class);

    private static final JerseyLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler = JerseyLambdaContainerHandler
            .getAwsProxyHandler(jerseyApplication);

    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
        handler.proxyStream(inputStream, outputStream, context);
    }
}

最佳答案

您不能自动注入(inject) Lambda 上下文。但是,您可以从 ContainerRequestContext 对象中检索它。 serverless-java-container框架将其添加为 a request property .

你可能会做这样的事情(没有测试代码):

@GET
public String testLambdaContext(@Context ContainerRequestContext containerRequest) {
   Context lambdaContext =
       (Context) containerRequest.getProperty(RequestReader.LAMBDA_CONTEXT_PROPERTY);
   return lambdaContext.getInvokedFunctionArn()
}

关于java - 为 Jersey 资源提供 lambda 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56671175/

相关文章:

amazon-web-services - AWS Lambda 函数的跨账户角色

java - Gradle 构建在 Android Studio 1.5.1 中失败

amazon-web-services - 如何从 AWS CLI 打印某个 Lambda 函数的最新 Cloudwatch 日志?

java - 为什么编码应该是 "to the interface"特别是对于原始数据类型?

php - 现实生活中的依赖注入(inject)

c# - 这是滥用依赖注入(inject)吗? (什么时候依赖不是依赖)

azure - .net 7 隔离的 Azure 函数依赖注入(inject)在部署时失败(在本地工作)

c# - Autofac 作为 AWS Lambda Serverless ASP.NET Core 3.1 Web API 中的 IoC 容器

java - 当存储库返回类型为 List<Post> 时,Spring JPA 查询返回 List<PageImpl>

java - Tomcat提交异常数量的虚拟内存并且不释放它