我尝试将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();
}
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在FirstLamdba中设置为null。
有什么想法吗?
答案 0 :(得分:3)
第一次调用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());
}
}
答案 1 :(得分:1)
Lambda RequestHandler
实例没有使用Guice,因此在@Inject
类中直接使用RequestHandler
不起作用。这就是您userService
属性始终为null的原因。
我没有尝试过将Guice与Lambda一起使用,但我相信你必须在某些时候显式调用Guice.createInjector()
才能引导Guice依赖注入。
一般情况下,在开发AWS Lambda函数时,我建议从一个POJO开始,它执行引导库的操作,并公开一个像persistUser()
这样的高级方法,您可以轻松地运行并独立于任何Lambda特定的测试码。一旦你开始工作,你的Lambda函数就会只是几行代码来实例化这个POJO的一个实例并调用persistUser()
方法。