DynamoDB ValidationException
TL;DR — ValidationException 意味着 DynamoDB 在_接触任何数据之前_就把请求作为格式错误而拒绝了。读消息文本:它会指明出错的确切参数。什么都没被写入,所以修正请求的形态并重试。
含义
ValidationException 是 DynamoDB 针对未通过验证的请求的通用客户端错误(HTTP 400)——一个错误的表达式、一个包裹在错误类型里的值、一个与表模式不匹配的键,或者超出了某个限制。它不可重试:再次发送同样的请求会产生同样的错误。
因为它是一族错误,修复方法完全取决于消息字符串。最常见的几种变体各有其自己的页面:
- Query condition missed key schema element
- The provided key element does not match the schema
- UpdateExpression 语法无效
- ExpressionAttributeValues contains invalid value
- Item size has exceeded the maximum allowed size
为什么会发生
- 一个不包含分区键、或引用了非键属性的 KeyConditionExpression。
- 一个类型与表定义不匹配的键属性(例如把数字作为字符串发送)。
- 一个格式错误的 UpdateExpression / ConditionExpression / FilterExpression——直接使用了一个保留字、缺少
#name或:value占位符。 - 在不允许的地方出现空值,或者一个解析为不受支持类型的属性。
- 超出限制——项目超过 400 KB、一个
BatchWriteItem中的项目过多、表达式过长。
如何修复
- 读完整消息。 DynamoDB 会告诉你哪个参数失败了——字符串很精确("Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: status")。
- 把它对应到上面的变体并应用那个页面的修复方法。
- 在发送前于本地验证请求形态——大多数
ValidationException都是表达式中的拼写错误或一个类型包裹。
常见问题
DynamoDB ValidationException 可以重试吗? 不能。请求本身格式错误,因此再次发送它会产生同样的错误。读消息文本——它会指明出错的确切参数——修正请求形态,然后再重试。
ValidationException 最常见的原因有哪些? 一个省略了分区键或引用了非键属性的 KeyConditionExpression、一个类型与表定义不匹配的键属性、一个使用了保留字或缺少占位符的格式错误表达式、在不允许的地方出现空值,或者超出限制,例如项目超过 400 KB。
相关错误
- ConditionalCheckFailedException——一个_条件_失败了(并非格式错误;写入有效但被拒绝)。
- ResourceNotFoundException——表或索引不存在。
- 学习:Expression names & values · Update expressions
参考资料
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
- Constraints in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Reserved words in DynamoDB — Amazon DynamoDB Developer Guide
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。