2016-10-29 16 views
4

Google GuiceをAWS Lambdaに統合しようとしていますが、何らかの理由で注入がうまく機能しません。AWS LambdaにGoogle Guiceを統合

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*********"); 
} 

バインディン:私は

ハンドラのコードを呼び出すようにしようとするたびにそれは私にはnullを与えますGクラス:

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に設定します。

答えて

1

ラムダRequestHandlerインスタンスはGuiceで計測されていないため、RequestHandlerクラスの内部に@Injectを直接使用することはできません。このため、userServiceプロパティは常にnullです。

私はLambdaでGuiceを使ってみることはしませんでしたが、Guice依存性注入をブートストラップするために、ある時点でGuice.createInjector()を明示的に呼び出さなければならないと思います。

一般に、AWS Lambda関数を開発する際には、ライブラリのブートストラップなどのPOJOから始めて、persistUser()のような単一の高レベルメソッドを公開してラムダ固有のコードから独立して簡単にテストしてテストすることをおすすめします。その作業が完了したら、ラムダ関数はこのPOJOのインスタンスをインスタンス化し、persistUser()メソッドを呼び出す数行のコードになります。

+0

おかげMark.iはちょうど試しを与え、私は、コード インジェクタインジェクタ= Guice.createInjector(新MessageGuiceModule())以下でnullポインタ例外を取得しています。 \t \t UserService userService = injector.getInstance(FirstLamdba .class); 何か不足していますか? – user1030128

+0

実際に有効なコードのようには見えません。まず、どのラインが正確にNPEを提供していますか?次に、FirstLambda.classの代わりにUserService.classのインスタンスを取得してはいけませんか?おそらく最新の問題をはっきりと見られるように、更新されたコードで質問を編集してください。 –

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