Интеграция Google Guice в AWS Lambda

Я пытаюсь интегрировать Google Guice в AWS Lambda, но по каким-то причинам внедрение не работает. Это дает мне ноль, когда я пытаюсь позвонить

Код обработчика:

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

UserService

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 устанавливается в NULL в FirstLamdba.

Любая идея?

2 ответа

При первом запуске лямбда-функции создается среда.

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

Лямбда RequestHandler Экземпляр не оснащен Guice, поэтому с помощью @Inject прямо внутри RequestHandler класс не собирается работать. Вот почему ты твой userService свойство всегда равно нулю

Я не пробовал использовать Guice с Lambda, но я считаю, что вам придется явно позвонить Guice.createInjector() в какой-то момент, чтобы начать инъекцию зависимостей Guice.

В общем, при разработке функций AWS Lambda я рекомендую начинать с POJO, который выполняет такие вещи, как загрузку ваших библиотек, и предоставляет один высокоуровневый метод, такой как persistUser() что вы можете легко запускать и тестировать независимо от любого конкретного кода Lambda. Как только вы начнете работать, ваша лямбда-функция будет состоять из нескольких строк кода, который создает экземпляр этого POJO и вызывает persistUser() метод.

Другие вопросы по тегам