AWS API Gateway-配置集成请求映射模板以接受字符串主体而不是JSON

时间:2019-03-20 21:26:35

标签: amazon-web-services spring-boot aws-lambda aws-api-gateway

我有一个带有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  

此外,请按照以下步骤定义映射模板。

  1. 打开“集成请求”设置,然后打开“人体贴图模板”。
  2. 选择选项:未定义模板时(推荐)
  3. 为以下内容添加了映射模板:application / json
  4. 添加了以下模板,以将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)"
      ]
    }
  }
}

2 个答案:

答案 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)

通过简单的更改即可解决我的问题。正如我在上述问题中提到的那样,我按照以下步骤操作。

  1. 打开“集成请求”设置,然后打开“人体贴图模板”。
  2. 选择选项:未定义模板时(推荐)
  3. 为以下内容添加了映射模板:application / json
  4. 添加了以下模板,以将userId映射到Lambda输入

    {“ userId”:“ $ input.params('userId')”}

在第4步中,我将下面的JSON格式替换为String格式。

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

在下面,它起作用了。我的API可以将String参数正确地传递给我的lambda函数,该函数具有一个处理程序方法,并且只有一个String类型的输入。

 $input.params('userId')