【问题标题】:Micronaut AWS Lambda Injected Dependencies NULLMicronaut AWS Lambda 注入依赖项 NULL
【发布时间】:2021-06-08 05:20:49
【问题描述】:

我们使用 Micronaut AWS 创建了一个 Lambda。

处理程序如下所示:

@Singleton
public class ValidationRequestHandler extends MicronautRequestHandler<S3Event, Integer> {
  @Inject private MessageService messageService;

  @Override
  public Integer execute(S3Event input) {
    messageService.init();
    [...]
  }
}

MessageService 类是这样的:

@Singleton
public class MessageService {

    private final SnsClient client;

    @Inject
    public MessageService(SnsClient client) {
        this.client = client;
    }

    public void init() {
       [...]
    }
}

在调用 Lambda 时,我们收到以下错误:

java.lang.NullPointerException: java.lang.NullPointerException

NullPointerException 由调用 messageService.init() 产生。进一步调试确认messageService确实是null

那么我们在这里缺少什么?

项目的gradle.build 如下:

plugins {
    id("com.github.johnrengelman.shadow") version "6.1.0"
    id("io.micronaut.library") version "1.3.4"
}

version = "1.0.0"
group = "our.project.group"

repositories {
    mavenCentral()
}

ext {
    micronautAwsVersion = '2.4.0'
    junitVersion = '5.7.1'
    awsSdkVersion = '2.16.14'
    lambdaVersion = '1.2.1'
    lambdaEventsVersion = '3.7.0'
    mockitoVersion = '3.8.0'
}

micronaut {
    testRuntime("junit5")
    processing {
        incremental(true)
        annotations("our.project.group.*")
    }
}

dependencies {
    implementation("io.micronaut:micronaut-validation")
    implementation("io.micronaut:micronaut-runtime")
    implementation("javax.annotation:javax.annotation-api")
    implementation("io.micronaut.aws:micronaut-function-aws")
    implementation group: 'io.micronaut.aws', name: 'micronaut-aws-sdk-v2', version: micronautAwsVersion
    implementation group: 'com.amazonaws', name: 'aws-lambda-java-events', version: lambdaEventsVersion
    implementation group: 'software.amazon.awssdk', name: 'sns', version: awsSdkVersion

    testImplementation("io.micronaut:micronaut-http-client")
    testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: junitVersion
    testImplementation group: 'org.junit.vintage', name: 'junit-vintage-engine', version: junitVersion
    testImplementation group: 'org.mockito', name: 'mockito-core', version: mockitoVersion
}

java {
    sourceCompatibility = JavaVersion.toVersion("11")
    targetCompatibility = JavaVersion.toVersion("11")
}

jar {
    manifest {
        attributes (
                'Class-Path': configurations.compile.collect {it.getName()}.join(' ')
        )
    }
    from {
        configurations.runtimeClasspath.collect {it.isDirectory() ? it : zipTree(it) }
    }
    dirMode = 0777
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

此外,该项目使用 lombok 以及 mapstruct。为简单起见,我在gradle.build 中省略了它们。

【问题讨论】:

  • 与您的问题无关,但仅供参考...我认为您的 @Inject 构造函数上的 @Inject 注释是多余的。

标签: java aws-lambda micronaut


【解决方案1】:

使用时应考虑通过构造函数进行注入,这是 GraalVM 原生应用程序的推荐方式。

@Singleton
public class ValidationRequestHandler extends MicronautRequestHandler<S3Event, Integer> {
  
  private final MessageService messageService;

  @Inject 
  public ValidationRequestHandler(MessageService messageService) {
     this.messageService = messageService;
  }

  @Override
  public Integer execute(S3Event input) {
    messageService.init();
    [...]
  }
}

【讨论】:

  • AWS 使用该类的默认构造函数,因此在 Micronaut Lambda 内部也无法进行这种注入,并且此代码在 aws lambda 上会失败。
  • 它在 AWS Lambda 中运行良好,我自己运行它。 public class Aws extends AbstractMicronautLambdaRuntime&lt;Request, Response, Request, Response&gt; { public static void main(String[] args) { try { new AwsLambdaRuntime().run(args); } catch (MalformedURLException e) { e.printStackTrace(); } } @Override @Nullable protected RequestHandler&lt;Request, Response&gt; createRequestHandler(String... args) { return getApplicationContext().getBean(ValidationRequestHandler.class); } }
猜你喜欢
  • 2019-01-18
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 2018-06-01
  • 2020-12-20
  • 2018-06-21
相关资源
最近更新 更多