【问题标题】:AWS Lambda unable to create Guice InjectorAWS Lambda 无法创建 Guice Injector
【发布时间】:2018-10-19 03:24:28
【问题描述】:

我正在尝试在 AWS Lambda 上运行 Spring Web 项目 (Java 8),该项目使用 Google Guice(V4.0) 来注入依赖项。

我可以使用IDE IntelliJ 运行,但是当我实现RequestHandler 时,它无法初始化 Google Guice 依赖项。下面是 Lambda 处理程序

public class CoreLambdaHandler implements RequestHandler<Map<String, String>, String> {

    private final Injector injector;

    public CoreLambdaHandler() {
        injector = Guice.createInjector(newApplicationModule());
    }

    @Override
    public String handleRequest(Map<String, String> input, Context context) {
        return "SUCCESS";
    }

这会导致以下错误:

com.google.inject.internal.MessageProcessor visit
INFO: An exception was caught and reported. Message: 

java.lang.NullPointerException
1) No implementation for java.lang.Integer annotated with @com.google.inject.name.Named(value=crawler.max.depth) was bound.
  while locating java.lang.Integer annotated with @com.google.inject.name.Named(value=crawler.max.depth)

2) No implementation for java.lang.Integer annotated with @com.google.inject.name.Named(value=crawler.max.pages) was bound.
  while locating java.lang.Integer annotated with @com.google.inject.name.Named(value=crawler.max.pages)

注意 - 我正在使用 Gradle 2.2.1 并使用影子插件构建一个 fatJar 以上传到 AWS Lambda Lambda 控制台上的配置 - S3 路径Handler name 正确 - com.aws.lambda.CoreLambdaHandler::handleRequest

感谢任何建议或参考

【问题讨论】:

    标签: java amazon-web-services aws-lambda


    【解决方案1】:

    据我了解,您不能在处理程序本身内部实例化 Injector,需要有其他东西(某种主要方法)来创建注入器,然后实际注入依赖项。

    我解决这些问题的方法是这样的:

    public class CoreLambdaEntryPoint implements RequestHandler<Map<String, String>, String> {
    
        private final Injector injector;
    
        private CoreLambdaHandler handler;
    
        public CoreLambdaEntryPoint() {
            injector = Guice.createInjector(new ApplicationModule());
            handler = injector.getInstance(CoreLambdaHandler.class);
        }
    
        @Override
        public String handleRequest(Map<String, String> input, Context context) {
            return handler.handleRequest(input);
        }
    
    
    public class CoreLambdaHandler {
    
        public String handleRequest(Map<String, String> input) {
            return "SUCCESS";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-19
      • 2015-08-19
      • 1970-01-01
      • 2019-07-26
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      相关资源
      最近更新 更多