AWS Lambda - 在Spring Boot Handler中注入Spring Bean

时间:2017-03-28 21:00:46

标签: java spring spring-boot lambda aws-lambda

我已将一个简单的Spring Boot项目上传到Amazon Lambda,我目前正在尝试测试它。 它100%工作但我尝试注入Spring Bean时得到一个空指针 这是我的LambdaHandler代码

package com.test.services.lambda;

import java.util.Calendar;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.test.services.MyServices;

public class MyLambdaFunctionHandler implements RequestHandler<String, String> {

    public MyLambdaFunctionHandler() {
    }


    @Autowired
    private ApplicationContext springContext;
    private MyServices myServices;

    public String handleRequest(String input, Context lambdaContext) {
        this.myServices = springContext.getBean(MyServices.class);
        lambdaContext.getLogger().log("AWS Request ID: " + lambdaContext.getAwsRequestId());
        lambdaContext.getLogger().log("Input: " + input + " at " + Calendar.getInstance().getTimeInMillis());
        myServices.sendGoodMessage("Message sent from Lambda");
        return "Hello World";
    }
}

我将Amazon Lambda中的处理程序设置为以下

com.test.services.lambda.MyLambdaFunctionHandler::handleRequest

但是,当我测试此功能时 - 我收到此错误消息

{
  "errorMessage": "java.lang.NullPointerException",
  "errorType": "java.lang.NullPointerException",
  "stackTrace": [
    "com.test.services.lambda.MyLambdaFunctionHandler.handleRequest(SlackLambdaFunctionHandler.java:23)",
    "com.test.services.lambda.MyLambdaFunctionHandler.handleRequest(SlackLambdaFunctionHandler.java:12)"
  ]
}

我注入Spring Bean失败了 任何人都可以就如何将Spring bean注入我的AWS Lambda处理程序提供任何建议吗?

非常感谢对此的任何帮助

由于 达明

1 个答案:

答案 0 :(得分:2)

有几种方法可以注入ApplicationContext

只要spring管理你的bean,你的工作就应该工作。您是否在某个MyLambdaFunctionHandler文件中将@Configuration声明为@Bean

您是否在某个地方使用new MyLambdaFunctionHandler()在春天@Configuration之外进行初始化? (这意味着spring不管理你的bean)。

如果spring不管理你的bean,它就不能将bean注入其中。

如果没有,则应使用@Component进行注释,并由某些@ComponentScan进行扫描。

如果声明了,您应该使用spring ApplicationContextAware来设置ApplicationContext。 Spring有很多这样的实用程序接口,可以将一些核心类注入到bean中。

示例:

public class MyLambdaFunctionHandler implements RequestHandler<String, String>, ApplicationContextAware {

    public MyLambdaFunctionHandler() {
    }

    private ApplicationContext springContext;
    private MyServices myServices;

    public String handleRequest(String input, Context lambdaContext) {
        this.myServices = springContext.getBean(MyServices.class);
        lambdaContext.getLogger().log("AWS Request ID: " + lambdaContext.getAwsRequestId());
        lambdaContext.getLogger().log("Input: " + input + " at " + Calendar.getInstance().getTimeInMillis());
        myServices.sendGoodMessage("Message sent from Lambda");
        return "Hello World";
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        this.springContext = applicationContext;
    }
}