gpt4 book ai didi

java - AWS 无法从 START_OBJECT 中反序列化 java.lang.String 的实例

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:58:24 25 4
gpt4 key购买 nike

我制作了一个 Lambda 函数,我想借助 API 网关通过 URL 访问它。

我已经全部设置好,我还在 API 网关中创建了一个 application/json 主体映射模板,如下所示:

{ 
"input": "$input.params('input')",
}

然后我触发了如下所示的 HTTP GET 请求:

https://dmquh95ckh.execute-api.eu-west-1.amazonaws.com/prod/OtoTestFunction?input=test

我的 Java 处理程序类如下所示:

public class LambdaFunctionHandler implements RequestHandler<String, String> {

@Override
public String handleRequest(String input, Context context) {
context.getLogger().log("Input: " + input);
return "Test completed."+input;
}
}

这是完整的错误信息:

{
"errorMessage": "An error occurred during JSON parsing",
"errorType": "java.lang.RuntimeException",
"stackTrace": [],
"cause": {
"errorMessage": "com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token\n at [Source: lambdainternal.util.NativeMemoryAsInputStream@68c4039c; line: 1, column: 1]",
"errorType": "java.io.UncheckedIOException",
"stackTrace": [],
"cause": {
"errorMessage": "Can not deserialize instance of java.lang.String out of START_OBJECT token\n at [Source: lambdainternal.util.NativeMemoryAsInputStream@68c4039c; line: 1, column: 1]",
"errorType": "com.fasterxml.jackson.databind.JsonMappingException",
"stackTrace": [
"com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)",
"com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:835)",
"com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:59)",
"com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:12)",
"com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1441)",
"com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1047)"
]
}
}
}

最佳答案

当我将输入参数的类型从 String 更改为 Object 时,它适用于所有场景。

public class LambdaFunctionHandler implements RequestHandler<Object, String> {

@Override
public String handleRequest(Object input, Context context) {
String data= input != null ? input.toString() : "{}";
context.getLogger().log("Input: " + data);
return "Test completed."+data;
}
}

*************************** 添加于 2021 年 3 月 12 日 **************** ***********

在研究了几个 Lambda 实现之后,我意识到输入参数不过是 JSON 结构的纯字符串表示或 Map 表示。对于 map 表示,Key 是属性的名称,值是 (1) 如果它是原始值,则为 String 或 (2) 如果它有多个值,则为 List,是另一个 Map 或另一个JSON 结构。您可以使用以下方法恢复 JSON 表示:

    if(input instanceof String)
{
String lambdaInputJsonStr = (String)input;
}
else if(input instanceof Map)
{
String lambdaInputJsonStr = gson.toJson((Map)input);
}

关于java - AWS 无法从 START_OBJECT 中反序列化 java.lang.String 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37155595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com