我有一个带有GET方法的Spring Boot应用程序,如下所示。此方法的输入参数为String,并与路径变量{userId}映射。
@GetMapping("/users/{userId}")
public String get(@PathVariable ("userId") String userId) {
return userId;
}
我创建了AWS lambda函数并上传了我的Spring Boot JAR。传递字符串示例“ userId1”后,我可以使用测试事件测试lambda功能。 Lambda函数工作正常。
使用API网关,创建的API,定义的资源和GET方法。 URL如下所示:
/users/{userId} - GET - Integration Request
此外,请按照以下步骤定义映射模板。
添加了以下模板,以将userId映射到Lambda输入
{ “ userId”:“ $ input.params('userId')” }
当我测试我的API时,它给了我以下异常。我不确定如何定义映射模板,使其仅接受String而不是JSON。因为我的Lambda函数和相应的实现方法仅接受String。在此先感谢您的帮助。
{
"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@69b2283a; 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@69b2283a; 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:857)",
"com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:62)",
"com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)",
"com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1511)",
"com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1102)"
]
}
}
}
答案 0 :(得分:0)
我认为您的问题发生是因为您正在映射JSON,如:
{
"key1": "value1",
"key2": "value2",
"key3": "value3",
"key4": {
"sub_key1": "value4"
}
}
此密钥包含一个密钥key4
,且JSON对象为值。当您尝试反序列化此元素时,它将无法直接运行,因为它看到的是JSON_OBJECT
,而不是字符串。
您需要创建一个类似于以下内容的类:
public class Name { // the name doesn't matter
@JsonProperty("sub_key1")
private String sub_key1;
// getter and setter
}
解决您的问题。
答案 1 :(得分:0)
通过简单的更改即可解决我的问题。正如我在上述问题中提到的那样,我按照以下步骤操作。
添加了以下模板,以将userId映射到Lambda输入
{“ userId”:“ $ input.params('userId')”}
在第4步中,我将下面的JSON格式替换为String格式。
{ "userId": "$input.params('userId')" }
在下面,它起作用了。我的API可以将String参数正确地传递给我的lambda函数,该函数具有一个处理程序方法,并且只有一个String类型的输入。
$input.params('userId')