AWS Lambda反序列化器/LinkedHashMap无法转换

4

我对Java/AWS等技术都很新,发现AWS lambda无法反序列化我认为很简单的示例。

API Gateway日志将JSON发送到我的lambda函数中:

请求test-request的执行日志 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-west-2:003374398906:8fjgcr51va/null/POST/, Accept=application/json, User-Agent=AmazonAPIGateway_8fjgcr51va, X-Amz-Security-Token=xxxxxxx//////////wEaDM3BrDjbuGSwMFT5lCK3AyBVM7duW9tzEe/bcWqWiYNIxkpMjTdDZaW3U32asJ4qvntUsRpjfSIhLWAds74XhzHbI7GzXMuV3zQYCIiYRX0ZL1s524J7mETGFN4OredlGln7CCEs3WR417UaPB4XLh6E0v71Srpg4a1kG7KB6426gN9CvXR0mmYbwpl9qtp9bovLgIoVnjYbx5j7qd7Fa3U4wQOqcHonlKtN/uDXMFW+vfHOJyu3gQUyvoVpMuXrQSF/gptEXG+l0v4+v1exq67sp8G5d8h1kAQTNQep8Q19kyOi9hWbNDyU7FzXWvfSRX7f9n6NGIuZ6LYIF3g2kPFY [TRUNCATED] 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)","reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:107)","reactor.core 我正在使用这个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的。 - Dave Syer
所以你正在使用Spring Cloud Function。示例项目是否有效,或者那是你正在运行的代码(从目前的上下文不清楚)? - Dave Syer
你是如何部署到Lambda的? - Dave Syer
我直接将zip上传到aws...奇怪的是,我曾经遇到过这个问题,然后它消失了,我无法弄清楚为什么,再次上传后现在又失败了。测试确认json可以与类一起使用,但在aws中却不行。 - codeputer
我不明白那个。你能发一个完整的示例吗? - Dave Syer
显示剩余3条评论
1个回答

4

如果我以正确的方式指定处理程序(在本例中为com.morethanheroic.uppercase.handler.aws.UppercaseFunctionHandler),它对我有效:

{
  "result": "FOO"
}

我认为错误在AWS控制台中处理程序的声明上。您必须放置类的FQN(而不是方法引用)。该方法没有通用类型信息,除非您覆盖它(您说这也起作用,但是是不必要的)。
OP拍摄了一个视频演示他部署和测试函数(https://www.screencast.com/t/mNOLS1XhM),几乎完美,除了处理程序名称。
如果其他人想尝试,请在此处查看代码:https://github.com/laxika/spring-cloud-function-aws-example

2
你说得对!哇,那真是令人痛苦。需要澄清以下几点:1)在AWS中,当指定入口点时,它并没有明确说明方法名称不是必需的,2)示例提供了这一行,但并没有明确说明方法名称不是必需的(实际上会导致模糊错误),3)Spring Cloud Function在这方面也没有任何文档。从.Net过来的开发者,我们可能会覆盖和抽象属性,而不是使用不太完善的约定。对于函数也是如此-我认为它应该被指定。 - codeputer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接