【问题标题】:AWS Lambda Java Handler Hello WorldAWS Lambda Java 处理程序 Hello World
【发布时间】:2016-08-06 12:23:25
【问题描述】:

我找到了新信息。我想我可能为我的 S3 事件源实现了错误的接口。到目前为止,我还无法让它工作或理解应该实现哪个接口(如果有的话)。 RequestHandler 接口需要方法 handleRequest 来返回一个值。有什么建议?

outputType – 如果您计划同步调用 Lambda 函数 (使用 RequestResponse 调用类型),可以返回输出 使用任何受支持的数据类型的函数。例如, 如果您使用 Lambda 函数作为移动应用程序后端,您就是 同步调用它。您的输出数据类型将被序列化 转换成 JSON。

如果您计划异步调用 Lambda 函数(使用 事件调用类型),则 outputType 应为 void。例如,如果 您将 AWS Lambda 与事件源(如 Amazon S3、Amazon Kinesis 和 Amazon SNS,这些事件源调用 Lambda 使用事件调用类型的函数。

我已经创建了一个基本的处理程序,但似乎错过了一个继续暗示我的关键步骤。

以下代码和错误:

package example;

import com.amazonaws.services.lambda.runtime.Context; 
import com.amazonaws.services.lambda.runtime.LambdaLogger; 
import com.amazonaws.services.lambda.runtime.RequestHandler; 
import com.amazonaws.services.s3.model.S3Event;

public class Hello implements RequestHandler<S3Event, Object> {
    public String handleRequest(S3Event input, Context context) {
        return "Hello";
    } 
}

{ "errorMessage": "解析JSON时出错",
“errorType”:“java.lang.RuntimeException”,“stackTrace”:[],
“原因”: { “errorMessage”:“com.fasterxml.jackson.databind.JsonMappingException:不能 反序列化 com.amazonaws.services.s3.model.S3Event 的实例 START_OBJECT 令牌\n 在源: lambdainternal.util.NativeMemoryAsInputStream@566776ad;线:1, 列:1", "errorType": "java.io.UncheckedIOException", “堆栈跟踪”: [], “原因”: { "errorMessage": "无法从 START_OBJECT 令牌中反序列化 com.amazonaws.services.s3.model.S3Event 的实例\n 来源:lambdainternal.util.NativeMemoryAsInputStream@566776ad;线: 1、列:1", "errorType": "com.fasterxml.jackson.databind.JsonMappingException", “堆栈跟踪”: [ “com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)”, “com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:835)”, “com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:831)”, “com.fasterxml.jackson.databind.deser.std.EnumDeserializer._deserializeOther(EnumDeserializer.java:137)”, “com.fasterxml.jackson.databind.deser.std.EnumDeserializer.deserialize(EnumDeserializer.java:89)”, “com.fasterxml.jackson.databind.deser.std.EnumDeserializer.deserialize(EnumDeserializer.java:18)”, “com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1441)”, “com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1047)”] } } }

【问题讨论】:

  • 我认为您应该返回一个可以序列化为 JSON 对象的值。 "Hello" 无效。

标签: java aws-lambda


【解决方案1】:

将handleRequest()方法的返回类型设为Object,也可以返回“Hello”。

【讨论】:

  • 我正在尝试添加一些我发现的其他信息,但似乎评论部分不允许这样做。
【解决方案2】:

你收到的错误信息

无法从 START_OBJECT 令牌中反序列化 com.amazonaws.services.s3.model.S3Event 的实例

表示作为输入参数传递给您的 Lambda 函数的值不代表 S3Event 对象。

您是否从 AWS 控制台测试您的 Lambda 函数,而不是触发真正的 S3 事件?
如果是这样,请转到 Lambda > Functions > yourFunction > Actions > Configure test event 并从 中选择 S3 Put 或 S3 Delete示例事件模板 下拉列表,用于向您的函数发送正确的输入以进行测试。

【讨论】:

    【解决方案3】:

    我认为您不能返回非对象响应。你可以这样做:

    return new Gson().fromJson(jsonObject, Object.class);
    

    注意:jsonObject 是一个 json,其中包含您要返回的信息。

    【讨论】:

      【解决方案4】:

      检查您是否正在导入正确的 S3Event 类,即 com.amazonaws.services.lambda.runtime.events.S3Event。

      我遇到了同样的异常,发现我已被导入 com.amazonaws.services.s3.model.S3Event。

      【讨论】:

        猜你喜欢
        • 2016-06-03
        • 1970-01-01
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-01
        • 2021-09-14
        • 2022-08-16
        相关资源
        最近更新 更多