API网关:"无法从START_OBJECT令牌中反序列化java.lang.String的实例"

时间:2016-05-23 10:14:48

标签: java amazon-web-services aws-lambda aws-api-gateway

还有其他问题涉及此错误,但他们正在寻找访问查询参数,这不是我的方案。

测试我的简单GET请求失败,并在测试控制台的errorMessage字段中显示以下内容:

Can not deserialize instance of java.lang.String out of START_OBJECT token\n at [Source: lambdainternal.util.NativeMemoryAsInputStream@6bdf28bb; line: 1, column: 1

我的lambda函数是一个简单的Java类,它带有一个静态方法get,它接受​​一个参数:来自路径参数的id。

例如,执行GETmysite.com/resource/1应该将1传递给我的静态类的get方法。

我还没有为此设置映射,因为我没有映射请求正文。 API网关文档非常混乱,并且在其示例中也很清楚,涵盖了类似的场景。

如何将路径参数映射到我的lambda函数的参数?

1 个答案:

答案 0 :(得分:1)

仅仅为了背景,Lambda函数没有任何"参数&#34 ;;一切都必须进入函数的请求有效负载。因此,在您的情况下,您需要在Integration上使用映射模板将传入的GET参数转换为可以提供给Lambda的JSON有效内容。

路径参数在与查询字符串参数相同的映射模板对象中可用,即$ input.params([name]),其中[name]是参数的名称。

所以你的模板看起来像这样:

Content-Type:application / json

模板:

{
  "resourceId" : "$input.params('your_name_here')"
}

我将JSON值放在引号中,但如果值保证为数字,则可以删除它们。无论如何,把它放在引号中可能更安全。

以下是模板参考:http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html

Content-Type在这里实际上很重要,因为API Gateway将检查传入请求的Content-Type标头,以确定要使用的映射模板。通常在GET请求中没有Content-Type标头,因此API Gateway假定您需要' application / json'因此,如果您的模板映射到application / json以外的内容类型,它将无法按预期工作。

编辑:有关Lambda集成的更多背景信息