You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:50:38