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.
任何的想法?
第一次调用 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)
LambdaRequestHandler实例未使用 Guice 进行检测,因此@Inject直接在RequestHandler类内部使用是行不通的。这就是为什么你的userService财产总是空的。
我还没有尝试过将 Guice 与 Lambda 一起使用,但我相信您必须Guice.createInjector()在某个时候显式调用才能引导 Guice 依赖注入。
一般来说,在开发 AWS Lambda 函数时,我建议从 POJO 开始,它可以执行诸如引导库之类的操作,并公开单个高级方法,这样persistUser()您就可以独立于任何 Lambda 特定代码轻松运行和测试。一旦您开始工作,您的 Lambda 函数将只是几行代码,用于实例化此 POJO 的实例并调用该persistUser()方法。
| 归档时间: |
|
| 查看次数: |
3932 次 |
| 最近记录: |