8

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

ユーザーサービス

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 として設定されます。

何か案が?

4

2 に答える 2

5

ラムダ関数が初めて呼び出されると、環境が作成されます。

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());
        }
}
于 2016-10-30T00:03:24.513 に答える
2

LambdaRequestHandlerインスタンスは Guice でインストルメント化されていないため@Inject、クラス内で直接使用してRequestHandlerも機能しません。userServiceこれが、プロパティが常に nullである理由です。

Lambda で Guice を使用したことはありませんが、Guice.createInjector()Guice の依存性注入をブートストラップするには、ある時点で明示的に呼び出す必要があると思います。

persistUser()一般に、AWS Lambda 関数を開発するときは、ライブラリのブートストラップなどを行い、Lambda 固有のコードから独立して簡単に実行およびテストできる単一の高レベル メソッドを公開する POJO から始めることをお勧めします。Lambda 関数が機能することがわかったら、この POJO のインスタンスをインスタンス化し、persistUser()メソッドを呼び出す数行のコードだけで済みます。

于 2016-10-29T20:34:40.403 に答える