当前位置: 首页 > 知识库问答 >
问题:

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

杨飞飙
2023-03-14

我有一个Spring启动应用程序与GET方法如下。此方法的输入参数为String,它与路径变量{userId}映射。

@GetMapping("/users/{userId}")
public String get(@PathVariable ("userId") String userId) {
        return userId;
}   

我创建了AWS lambda函数并上传了我的Spring BootJAR。在传递字符串示例“userId1”后,我能够使用测试事件测试lambda函数。Lambda函数运行良好。

使用API网关,创建API,定义资源和GET方法。URL如下所示:

/users/{userId} - GET - Integration Request  

此外,遵循以下步骤来定义映射模板。

>

  • 打开了集成请求设置和正文映射模板。
  • 选择选项:当没有定义模板时(推荐)
  • 为应用程序/json添加了一个映射模板
  • 添加了以下模板以将userId映射到Lambda输入

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

    当我测试我的API时,它给出了以下异常。我不确定应该如何定义映射模板,使其只接受字符串而不接受JSON。因为我的Lambda函数和相应的实现方法只接受字符串。提前谢谢你的帮助。

    {
      "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个答案

    曹焱
    2023-03-14

    我的问题通过简单的改变就解决了。正如我在上述问题中提到的,我遵循以下步骤。

    >

    选择选项:未定义模板时(推荐

    添加了一个映射模板:application/json

    添加了以下模板以将userId映射到Lambda输入

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

    在最后一步#4中,我将下面的JSON格式替换为字符串格式。

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

    在下面,它起了作用。我的API可以将String参数正确地传递给lambda函数,该函数有一个带有String类型的单一输入的handler方法。

     $input.params('userId')
    
    左丘宜年
    2023-03-14

    我认为出现问题是因为您正在映射类似于以下内容的JSON:

    {
        "key1": "value1",
        "key2": "value2",
        "key3": "value3",
        "key4": {
            "sub_key1": "value4"
        }
    }
    

    它包含一个键key4,值为和JSON对象。当您尝试反序列化此元素时,它将无法直接工作,因为它看到的是JSON\u对象,而不是字符串。

    您需要创建一个类,如下所示:

    public class Name { // the name doesn't matter 
        @JsonProperty("sub_key1")
        private String sub_key1;
        // getter and setter
    }
    

    来解决你的问题。

     类似资料:
    • 当我发送一个带有POST请求的正文时,我的模板映射似乎被有效负载覆盖了。 我有一个调用Lambda函数的API网关资源。Lambda函数很简单,它只是回显它接收到的内容。 这个名为echo的Lambda函数通过POST调用Lambda函数。POST方法有一个集成请求映射模板(直接来自文档): 当我在没有尸体的情况下提出请求时,我会得到我期望的答复: 但是,当我用主体发出请求时,模板映射不再工作:

    • 我有一个API阶段没有使用“Lambda代理集成”,它有一个Lambda函数传递一个错误。 在映射模板中,我有以下内容: 有可能做我想做的事吗?我找不到$util.parsejson(即stringify)的反向。 谢谢!

    • 问题内容: 我的印象是,使用x-www-form-urlencoded规范的POSTS应该在帖子正文中发送URL编码的参数字符串。但是,当我这样做时 接收端的请求主体如下所示: 但我期望得到这个 我如何获得请求以第二种形式发送数据? 问题答案: 获得JSON的原因是因为您显式调用以生成JSON字符串。只是不这样做,您就不会得到JSON字符串。换句话说,将第一行更改为: 正如文档所解释的,如果将di

    • 解决方案:将包重命名为,必须是主包的子包(包含main方法的子包) 我已经讨论过以下主题,但似乎没有一个对我有效: RequestMapping导致404错误,添加了regex(到Rest控制器,到方法),但仍然不会映射它。 Spring@RequestMapping,404 error在我的pom.xml中添加了,尽管我找不到更改它的路径(我怀疑可能存在问题,但我不确定)。 请求映射返回错误40

    • 我是Mapstruct的新手。我有一个Word对象,它包含一个字符串值和一组它自己,我想把它映射到WordDTO,它包含一个值和一组字符串值。我不知道怎么做。正如我在注释中所说,mapstruct不能映射两个对象是有道理的,但如果它有帮助,我将错误放在下面: 我为映射实现了这个接口: 谢谢你的帮助。