在AWS Lambda中集成Google Guice

8

我尝试在 AWS Lambda 中集成 Google Guice,但由于一些原因,注入功能无法正常工作。每当我尝试调用时,它都会给我 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();
}

用户服务

public interface UserService {
    List<String> persistData();
}

UserServiceImpl

public class UserServiceImpl implements UserService{


    @Override
    public List<String> persistData() {

        System.out.println("***Working*********");
}

绑定类:

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

    bind(UserService.class).to(UserServiceImpl.class);
  }
}

测试类:

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

由于某些原因,UserService userService 在 FirstLambda 中被设置为空。
有任何想法?
2个回答

6
第一次调用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());
        }
}

2
Lambda RequestHandler 实例没有使用 Guice 进行仪器化,因此在 RequestHandler 类内部直接使用 @Inject 是行不通的。这就是为什么你的 userService 属性始终为空的原因。
我还没有尝试在 Lambda 中使用 Guice,但我相信你必须在某个时候显式调用 Guice.createInjector() 以启动 Guice 依赖注入。
一般来说,在开发 AWS Lambda 函数时,我建议从一个 POJO 开始,该 POJO 做一些诸如引导库之类的事情,并公开一个单一高级方法,例如 persistUser(),你可以轻松地独立运行和测试,而不需要任何特定于 Lambda 的代码。一旦你完成了这项工作,Lambda 函数将只是几行代码,实例化这个 POJO 并调用 persistUser() 方法。

谢谢Mark。我刚试了一下,使用以下代码出现了空指针异常: Injector injector = Guice.createInjector(new MessageGuiceModule()); UserService userService = injector.getInstance(FirstLamdba.class); 我有什么遗漏吗? - user1030128
那看起来实际上不像是有效的代码。首先,哪一行确切地导致了NPE?其次,你应该获取UserService.class的实例而不是FirstLambda.class吧?也许编辑你的问题并附上更新后的代码,这样我们就可以清楚地看到最新的问题了。 - Mark B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接