Интеграция 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()
метод.