向Jersey资源提供lambda上下文

时间:2019-06-19 15:23:35

标签: java dependency-injection aws-lambda jersey

我正在使用aws-serverless-java-container将Jersey服务包装在AWS Lambda中。我决定使用函数别名进行“测试”和“生产”阶段,最终指向不同版本的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?我可以注射吗?

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);
    }
}

2 个答案:

答案 0 :(得分:1)

您不能自动注入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()
}

答案 1 :(得分:0)

您可以使用Spring profile

向球衣资源注入上下文

为测试和产品简介定义不同的方法/对象

如果没有Spring,则可以选中jersey integration

  

jersey-spring4模块将充当Spring和Jersey的集成桥。

在github aws-serverless-java-container库中查看完整示例,该库运行带有AWS Lambda中的配置文件的Spring应用程序

  

有两种方法可以激活Spring Profiles(由@Profile注释定义)。我们建议使用接收配置文件列表的静态初始化程序。无服务器Java容器框架负责设置配置文件并立即初始化应用程序。

public class StreamLambdaHandler implements RequestStreamHandler {
    private static SpringLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler;
    static {
        try {
            AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
            applicationContext.register(PetStoreSpringAppConfig.class);
            handler = SpringLambdaContainerHandler.getAwsProxyHandler(applicationContext, "profile-1", "profile-2");