我正在使用 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/