【问题标题】:AWS Lambda de-serializer / LinkedHashmap cannot castAWS Lambda 反序列化器/LinkedHashmap 无法强制转换
【发布时间】:2018-02-20 01:50:39
【问题描述】:

我是 Java/AWS 等的新手,AWS lambda 我们不会反序列化我认为是微不足道的例子。

API 网关日志,它将 JSON 发送到我的 lambda:

请求测试请求的执行日志 2017 年 9 月 11 日星期一 18:04:06 UTC:开始执行请求:test-invoke-request 2017 年 9 月 11 日星期一 18:04:06 UTC:HTTP 方法:POST,资源路径:/ 2017 年 9 月 11 日星期一 18:04:06 UTC:方法请求路径:{} 2017 年 9 月 11 日星期一 18:04:06 UTC:方法请求查询字符串:{} 2017 年 9 月 11 日星期一 18:04:06 UTC:方法请求标头:{Content-Type=application/json} 2017 年 9 月 11 日星期一 18:04:06 UTC:转换前的方法请求正文:{“input”:“richard was here”} 2017 年 9 月 11 日星期一 18:04:06 UTC:端点请求 URI:https://lambda.us-west-2.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-west-2:003374398906:function:uppertolowercase/invocations 2017 年 9 月 11 日星期一 18:04:06 UTC:端点请求标头:{x-amzn-lambda-integration-tag=test-request, Authorization=****************** ****************************************************** ****************************************************** ****************************************************** ****************************************************** ****************************************************** ****************************************************** **********8acc24,X-Amz-Date=20170911T180406Z,x-amzn-apigateway-api-id=8fjgcr51va,X-Amz-Source-Arn=arn:aws:execute-api:us-西2:003374398906:8fjgcr51va /空/ POST /,接受=应用/ JSON,用户代理= AmazonAPIGateway_8fjgcr51va,X-AMZ-安全令牌= XXXXXXX ////////// wEaDM3BrDjbuGSwMFT5lCK3AyBVM7duW9tzEe / bcWqWiYNIxkpMjTdDZaW3U32asJ4qvntUsRpjfSIhLWAds74XhzHbI7GzXMuV3zQYCIiYRX0ZL1s524J7mETGFN4OredlGln7CCEs3WR417UaPB4XLh6E0v71Srpg4a1kG7KB6426gN9CvXR0mmYbwpl9qtp9bovLgIoVnjYbx5j7qd7Fa3U4wQOqcHonlKtN / uDXMFW + vfHOJyu3gQUyvoVpMuXrQSF/gptEXG+l0v4+v1exq67sp8G5d8h1kAQTN Qep8Q19kyOi9hWbNDyU7FzXWvfSRX7f9n6NGIuZ6LYIF3g2kPFY [截断] 2017 年 9 月 11 日星期一 18:04:06 UTC:转换后的端点请求正文:{“input”:“richard was here”} 2017 年 9 月 11 日星期一 18:04:06 UTC:向https://lambda.us-west-2.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-west-2:003374398906:function:uppertolowercase/invocations 发送请求 2017 年 9 月 11 日星期一 18:04:06 UTC:收到回复。集成延迟:73 毫秒 2017 年 9 月 11 日星期一 18:04:06 UTC:转换前的端点响应正文:{"errorMessage":"java.util.LinkedHashMap cannot be cast to com.morethanheroic.uppercase.domain.UppercaseRequest","errorType":"java. lang.ClassCastException","stackTrace":["com.morethanheroic.uppercase.UppercaseFunction.apply(UppercaseFunction.java:13)","org.springframework.cloud.function.support.FluxFunction.lambda$apply$0(FluxFunction.java :42)","re​​actor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:107)","re​​actor.core.publisher.FluxJust$WeakScalarSubscription.request(FluxJust.java:90)","re​​actor. core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:159)","re​​actor.core.publisher.BlockingIterable$SubscriberIterator.onSubscribe(BlockingIterable.java:214)","re​​actor.core.publisher.FluxMapFuseable$MapFuseableSubscriber. onSubscribe(FluxMapFuseable.java:90)","re​​actor.core.publisher.FluxJust.subscribe(FluxJust.java:67)","re​​actor.core.publisher.FluxMapFuseab le.subscribe(FluxMapFuseable.java:63)","re​​actor.core.pu [截断] 2017 年 9 月 11 日星期一 18:04:06 UTC:端点响应标头:{x-amzn-Remapped-Content-Length=0, x-amzn-RequestId=9a0ca35b-971b-11e7-b0d0-653f3fe89968, Connection=keep-alive, Content-Length=1557,X-Amz-Function-Error=Unhandled,Date=Mon,2017 年 9 月 11 日 18:04:05 GMT,X-Amzn-Trace-Id=root=1-59b6d016-3a1ae0e3274a3e84e451bf13;sampled=0,内容类型=应用程序/json} 2017 年 9 月 11 日星期一 18:04:06 UTC:转换后的方法响应正文:{"errorMessage":"java.util.LinkedHashMap 无法转换为 com.morethanheroic.uppercase.domain.UppercaseRequest","errorType":"java. lang.ClassCastException","stackTrace":["com.morethanheroic.uppercase.UppercaseFunction.apply(UppercaseFunction.java:13)","org.springframework.cloud.function.support.FluxFunction.lambda$apply$0(FluxFunction.java :42)","re​​actor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:107)","re​​actor.core.publisher.FluxJust$WeakScalarSubscription.request(FluxJust.java:90)","re​​actor. core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:159)","re​​actor.core.publisher.BlockingIterable$SubscriberIterator.onSubscribe(BlockingIterable.java:214)","re​​actor.core.publisher.FluxMapFuseable$MapFuseableSubscriber. onSubscribe(FluxMapFuseable.java:90)","re​​actor.core.publisher.FluxJust.subscribe(FluxJust.java:67)","re​​actor.core.publisher.FluxMapFuseable.订阅(FluxMapFuseable.java:63)","re​​actor.core.publi [截断] 2017 年 9 月 11 日星期一 18:04:06 UTC:方法响应标头:{X-Amzn-Trace-Id=sampled=0;root=1-59b6d016-3a1ae0e3274a3e84e451bf13, Content-Type=application/json} 2017 年 9 月 11 日星期一 18:04:06 UTC:成功完成执行 2017 年 9 月 11 日星期一 18:04:06 UTC:方法完成,状态:200

我正在使用这个 JSON 来提供要反序列化到以下 POJO 的数据

 {"input":"richard was here"} 



public class UppercaseRequest {

    private String input;

    public String getInput() {
        return input;
    }

    public void setInput(final String input) {
        this.input = input;
    }
}

这里是处理程序

public class UppercaseFunctionHandler extends SpringBootRequestHandler<UppercaseRequest, UppercaseResponse> {
}

注意:取自示例项目 https://github.com/laxika/spring-cloud-function-aws-example

示例中没有记录 - 但我使用的 Lambda 入口点是:

com.morethanheroic.uppercase.handler.aws.UppercaseFunctionHandler::handleRequest

【问题讨论】:

  • 如果那是 JSON,那是目标,那么 AWS 知道如何进行转换。所以我希望你省略了一些关键信息。例如,您没有提及处理程序或它向 AWS 声明的方式。
  • 使用处理程序更新问题
  • 所以你使用的是spring cloud功能。示例项目是否有效,还是您正在运行的代码(目前尚不清楚)?
  • 您是如何部署到 Lambda 的?
  • 我直接将 zip 上传到 aws... 奇怪的是我遇到了这个问题,然后它就消失了,我不知道为什么,再次上传,现在它失败了。测试确认 json 可以与类一起使用,但在 aws 中它不会。

标签: java aws-lambda aws-api-gateway


【解决方案1】:

如果我以正确的方式指定处理程序(在这种情况下为com.morethanheroic.uppercase.handler.aws.UppercaseFunctionHandler),它对我有用:

{
  "result": "FOO"
}

我认为错误在于 AWS 控制台中的处理程序声明。您必须放置 class 的 FQN(不是方法引用)。该方法没有泛型类型信息,除非您覆盖它(您说它也有效,但没有必要)。

OP 做了一个自己部署和测试函数的截屏视频 (https://www.screencast.com/t/mNOLS1XhM),除了处理程序名称之外几乎都是完美的。

如果其他人想尝试,代码在这里:https://github.com/laxika/spring-cloud-function-aws-example

【讨论】:

  • 你是对的!哇好痛啊。需要澄清:1)在 AWS 中,它没有明确说明在指定入口点时不需要方法名称,2)示例给出了这一行,但没有明确说明不需要方法名称(实际上导致模糊错误),以及 3)Spring Cloud Function 在这方面也没有任何文档。来自 .Net,我们将拥有覆盖和抽象的属性,而不是没有很好记录的约定。该功能也是如此 - 也应指定 IMO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
相关资源
最近更新 更多