首页 文章

AWS Lambda反序列化器/ LinkedHashmap无法强制转换

提问于
浏览
1

我是Java / AWS等的新手,而AWS lambda我们没有反序列化我认为是一个微不足道的例子 .

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

请求测试请求的执行日志Mon Sep 11 18:04:06 UTC 2017:开始执行请求:test-invoke-request Mon Sep 11 18:04:06 UTC 2017:HTTP方法:POST,资源路径:/ Mon 9月11日18:04:06 UTC 2017:方法请求路径:{} Mon Sep 11 18:04:06 UTC 2017:方法请求查询字符串:{} Mon Sep 11 18:04:06 UTC 2017:方法请求标头:{ Content-Type = application / json} Mon Sep 11 18:04:06 UTC 2017:转换前的方法请求体:{“input”:“richard在这里”} Mon Sep 11 18:04:06 UTC 2017: endpoints 请求URI :https://lambda.us-west-2.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-west-2:003374398906:function:uppertolowercase/invocations Mon Sep 11 18:04 :06 UTC 2017: endpoints 请求标头:{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-安全令牌= XXXXXXX ////////// wEaDM3BrDjbuGSwMFT5lCK3AyBVM7duW9tzEe / bcWqWiYNIxkpMjTdDZaW3U32asJ4qvntUsRpjfSIhLWAds74XhzHbI7GzXMuV3zQYCIiYRX0ZL1s524J7mETGFN4OredlGln7CCEs3WR417UaPB4XLh6E0v71Srpg4a1kG7KB6426gN9CvXR0mmYbwpl9qtp9bovLgIoVnjYbx5j7qd7Fa3U4wQOqcHonlKtN / uDXMFW vfHOJyu3gQUyvoVpMuXrQSF / gptEXG l0v4 v1exq67sp8G5d8h1kAQTNQep8Q19kyOi9hWbNDyU7FzXWvfSRX7f9n6NGIuZ6LYIF3g2kPFY [TRUNCATED]星期一年09月11 18点04分06秒UTC 2017:变换后 endpoints 请求体:{“输入“:”理查德在这里“}星期一9月11日18:04:06 UTC 2017:发送请求到https://lambda.us-west-2.amazonaws.com/2015-03-31/functions/arn:aws:拉姆达:美西2:0033743 98906:功能:uppertolowercase / invocations Mon Sep 11 18:04:06 UTC 2017:收到回复 . 集成延迟:73 ms周一11月11日18:04:06 UTC 2017:转换前的 endpoints 响应体:{“errorMessage”:“java.util.LinkedHashMap无法转换为com.morethanheroic.uppercase.domain.UppercaseRequest”,“errorType “:” java.lang.ClassCastException “ ”堆栈跟踪“: ”com.morethanheroic.uppercase.UppercaseFunction.apply(UppercaseFunction.java:13)“,” org.springframework.cloud.function.support.FluxFunction.lambda $申请$ 0(FluxFunction.java:42) “ ”reactor.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onNext(FluxMapFuseable.java:107)“,” reactor.core.publisher.FluxJust $ WeakScalarSubscription.request(FluxJust.java:90) “ ”reactor.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.request(FluxMapFuseable.java:159)“, ”reactor.core.publisher.BlockingIterable $ SubscriberIterator.onSubscribe(BlockingIterable.java:214)“,” reactor.core.publisher .FluxMapFuseable $ MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:90) “ ”reactor.core.publisher.FluxJust.subscribe(FluxJust.java:67)“,” reactor.c ore.publisher.FluxMapFuseable.subscribe(FluxMapFuseable.java:63)“,”reactor.core.pu [TRUNCATED]星期一9月11日18:04:06 UTC 2017:终点响应 Headers :{x-amzn-Remapped-Content-Length = 0,x-amzn-RequestId = 9a0ca35b-971b-11e7-b0d0-653f3fe89968,Connection = keep-alive,Content-Length = 1557,X-Amz-Function-Error =未处理,日期=星期一,2017年9月11日18: 04:05 GMT,X-Amzn-Trace-Id = root = 1-59b6d016-3a1ae0e3274a3e84e451bf13; samples = 0,Content-Type = application / json} Mon Sep 11 18:04:06 UTC 2017:转换后的方法响应体: {“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 $ $申请0(FluxFunction.java:42)“,” reactor.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onNext (FluxMapFuseable.java:107)","reactor.core.publisher.Flux只需$ WeakScalarSubscription.request(FluxJust.java:90) “ ”reactor.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.request(FluxMapFuseable.java:159)“,” reactor.core.publisher.BlockingIterable $ SubscriberIterator.onSubscribe(BlockingIterable . 的java:214) “ ”$ reactor.core.publisher.FluxMapFuseable MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:90)“, ”reactor.core.publisher.FluxJust.subscribe(FluxJust.java:67)“,” reactor.core .publisher.FluxMapFuseable.subscribe(FluxMapFuseable.java:63)“,”reactor.core.publi [TRUNCATED]星期一9月11日18:04:06 UTC 2017:方法响应 Headers :{X-Amzn-Trace-Id = sampled = 0; root = 1-59b6d016-3a1ae0e3274a3e84e451bf13,Content-Type = application / json} Mon Sep11 18:04:06 UTC 2017年:成功完成执行周一9月11日18:04:06 UTC 2017:方法已完成,状态: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

2 回答

  • 0

    如果我以正确的方式指定处理程序(在本例中为 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 .

  • 1

    虽然我不知道样本有什么问题,如果你正确地遵循它,你似乎想要将 HashMap 转换为 UppercaseRequest .

    为什么不尝试将处理程序修改为:

    public class UppercaseFunctionHandler extends 
      SpringBootRequestHandler<Map<String,Object>, UppercaseResponse> {
    }
    

    这可以让您检查它是否正常工作并接近所需的POJO映射 . 如果您分析Map的值,如果您获得API-Gateway标头数据并且不仅仅是您想要的正文数据,我也不会感到惊讶 .

相关问题