是否可以在 Kotlin/Java 中创建 AWS lambda 处理程序而不实施 RequestHandler?

Can an AWS lambda handler be created in Kotlin/Java without implementing RequestHandler?

TLDR:在 CDK 中,lambda 处理程序是方法引用,因此对于 Java/Kotlin 是否需要实现 RequestHandler class?

在 Java/Kotlin 中定义 lambda 的典型方法是扩展请求处理程序 class 并覆盖 handleRequest 函数。但是,当您在 Java 中有许多相似的函数时,这会导致许多相似的 files/class 定义。

推荐的定义如下:

public class Handler implements RequestHandler<Event, String>{

  @Override
  public String handleRequest(Event event, Context context)
  {
      ...
  }
}

而我能想到的最简单的 Kotlin 自然也算不上什么大的改进。它看起来像这样:

class Handler : RequestHandler<Event, String> {
    override fun handleRequest(request: Event, context: Context) : String {
       ...
    }
}

在 CDK 中,lambda 处理程序是一个方法引用,所以 "RequestHandler" 实现是必要的吗?这真的是关键问题,放在最前面。

在 Java 中,最简单的 Lambda 处理程序如下所示:

public class SampleHandler implements RequestStreamHandler {

    public void handleRequest(InputStream inputStream,
                              OutputStream outputStream,
                              Context context) throws IOException {
        context.getLogger().log("in the Lambda handler");
    }
}

handleRequest 方法中,您必须从 inputStream 中读取。一个例子可以是:

ObjectMapper mapper = new ObjectMapper();

YourObject yourObject = mapper.readValue(inputStream, YourObject.class);

现在您有了 Lambda 通常会为您反序列化的对象。要 "return" 你只需要写到 outputStream:

OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);
writer.write("{\"result\":\"everything is awesome\"}");

writer.close();

当然你也可以使用 mapper.writeValue(outputStream, yourResultObject) 之类的东西来不自己做 JSON 序列化。

您不必实现 RequestHandler 接口。根据 official documentation,如果您的 class 没有实现 RequestHandler 接口,您只需要告诉 AWS 要调用哪个函数:

example.Handler::handleRequest

在 CDK 应用程序中定义这样的函数没有什么特别的:

Function handlerFunction = Function.Builder.create(this, "ExampleHandlerFunction")
        .functionName("example-handler-function")
        .handler("example.Handler::handleRequest")
        .runtime(Runtime.JAVA_11)
        .code(Code.fromAsset("path/to/the/jar"))
        .build();