在AWS Lambda中集成Google Guice

use*_*128 6 java guice guice-3 java-8 aws-lambda

我正在尝试将Google Guice集成到AWS Lambda中,但由于某些原因,注入效果不佳.每当我试着打电话时,它都会给我null

处理程序代码:

public class FirstLamdba implements RequestHandler<Request, Object>{   

        private UserService userService;

        @Inject
        public void seUserService(UserService userService) {
            this.userService = userService;
        }

        public Object handleRequest(Request request, Context context){

            userService.persistData();
}
Run Code Online (Sandbox Code Playgroud)

UserService

public interface UserService {
    List<String> persistData();
}
Run Code Online (Sandbox Code Playgroud)

UserServiceImpl

public class UserServiceImpl implements UserService{


    @Override
    public List<String> persistData() {

        System.out.println("***Working*********");
}
Run Code Online (Sandbox Code Playgroud)

绑定类:

public class MessageGuiceModule extends AbstractModule
{
  protected void configure() {

    bind(UserService.class).to(UserServiceImpl.class);
  }
}
Run Code Online (Sandbox Code Playgroud)

测试类:

 @Test
        public void testLambdaFunctionHandler() {
Request request = new Request();
            request.setName("Name");
            FirstLamdba handler = new FirstLamdba();
            Context ctx = createContext();

            Object output = handler.handleRequest(request, ctx);

            // TODO: validate output here if needed.
            if (output != null) {
                System.out.println(output.toString());
            }
        }
Run Code Online (Sandbox Code Playgroud)

出于某些原因,UserService userService在FirstLamdba中设置为null.

任何的想法?

frh*_*ack 5

第一次调用 lambda 函数时,将创建环境。

public class FirstLamdba implements RequestHandler<Request, Object>{   

        Injector injector = Guice.createInjector(new MessageGuiceModule());
        private UserService userService = injector.getInstance(UserService.class);


        //setter for testing purpose
        public void setUserService(UserService userService) {
            this.userService = userService;
        }

        public Object handleRequest(Request request, Context context){

            userService.persistData();
}


@Test
public void testLambdaFunctionHandler() {
        Request request = new Request();
        request.setName("Name");
        FirstLamdba handler = new FirstLamdba();
        handler.setUserService(mockUserService);

        Context ctx = createContext();

        Object output = handler.handleRequest(request, ctx);

        // TODO: validate output here if needed.
        if (output != null) {
            System.out.println(output.toString());
        }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*k B 2

LambdaRequestHandler实例未使用 Guice 进行检测,因此@Inject直接在RequestHandler类内部使用是行不通的。这就是为什么你的userService财产总是空的。

我还没有尝试过将 Guice 与 Lambda 一起使用,但我相信您必须Guice.createInjector()在某个时候显式调用才能引导 Guice 依赖注入。

一般来说,在开发 AWS Lambda 函数时,我建议从 POJO 开始,它可以执行诸如引导库之类的操作,并公开单个高级方法,这样persistUser()您就可以独立于任何 Lambda 特定代码轻松运行和测试。一旦您开始工作,您的 Lambda 函数将只是几行代码,用于实例化此 POJO 的实例并调用该persistUser()方法。