AWS API Gateway调用DynamoDB UpdateItem返回SerializationException问题
DynamoDB UpdateItem映射模板序列化异常排查
问题背景
刚接触AWS/DynamoDB,尝试在API中实现UpdateItem方法,已创建路径为x/users/update/{wallet}的资源(wallet为主键)。按照其他Query/Scan/PutItem方法的配置方式设置UpdateItem后,调用返回200状态码,但携带"__type": "com.amazon.coral.service#SerializationException"异常信息,确定问题出在映射模板。
初始映射模板
{ "TableName": "Users", "KeyConditionExpression": "wallet = :v1", "ExpressionAttributeValues": { ":v1": { "S": "$input.params('wallet')" } ":v2": { "S": $input.json('$.username') } } "UpdateExpression": "set username = :v2", "ReturnValues": "UPDATED_NEW" }
修改后的测试模板
{ "TableName": "Users", "Key": { "wallet": { "S": "$input.params('wallet')" }, }, "UpdateExpression": "SET username = :val1", "ExpressionAttributeValues": { ":val1": { "S": "$input.path('$.username')" }, }, "ReturnValues": "ALL_NEW" }
请求负载:
{"username":"test"}
参考的PutItem映射模板
{ "TableName": "Users", "Item": { "userId": { "S": "$context.requestId" }, "date": { "S": "$input.path('$.date')" }, "wallet": { "S": "$input.path('$.wallet')" } } }
问题原因及修正方案
序列化异常的核心原因是JSON语法错误,以及UpdateItem参数使用不当,具体问题如下:
1. JSON语法错误(两次模板均存在)
- 初始模板:
ExpressionAttributeValues内:v1对象后缺少逗号,UpdateExpression字段前缺少逗号;$input.json('$.username')未加引号,会导致字符串值解析失败。 - 修改后模板:
Key内wallet对象后多了尾逗号,ExpressionAttributeValues内:val1对象后多了尾逗号——JSON不允许对象最后一个键值对后添加逗号。
2. UpdateItem参数误用(仅初始模板存在)
UpdateItem操作不需要KeyConditionExpression参数,该参数是Query/Scan操作的筛选条件,UpdateItem需用Key指定要更新的主键条目。
正确的映射模板示例
{ "TableName": "Users", "Key": { "wallet": { "S": "$input.params('wallet')" } }, "UpdateExpression": "SET username = :val1", "ExpressionAttributeValues": { ":val1": { "S": "$input.path('$.username')" } }, "ReturnValues": "ALL_NEW" }
额外说明
- 保持和PutItem模板一致的写法,使用
$input.path('$.username')提取JSON值并加引号,符合DynamoDB的JSON格式要求。 - 严格遵循JSON语法:对象中间的键值对用逗号分隔,最后一个键值对后不能加逗号。
内容的提问来源于stack exchange,提问作者Wesley van S
相关产品推荐
相关产品推荐

