DynamoDB调用PutItem报ExpressionAttributeNames仅可用于表达式场景错误如何解决
错误根因
你触发报错的直接原因是:PutItem 接口不允许在没有配套使用表达式的场景下传入 ExpressionAttributeNames(也就是你代码中的NameMap)和ExpressionAttributeValues(也就是你代码中的ValueMap),报错信息已经明确指出了这个规则。
PutItemSpec 和 UpdateItemSpec 的核心差异
两者的设计逻辑确实有本质区别:
UpdateItemSpec是基于UpdateExpression实现部分字段更新,需要用NameMap做保留字转义、ValueMap做值占位,这两个参数是和更新表达式配套使用的PutItemSpec是全量写入/覆盖整个Item对象,不需要定义更新表达式,属性直接写入Item实例即可,不需要做占位转义,只有当你使用ConditionExpression等可选表达式的时候,才需要配套传入对应的NameMap和ValueMap
修复方案
你目前的代码中构造的NameMap和ValueMap完全没有被实际使用,直接把所有属性写入Item对象即可,修改createPutItemSpec方法如下:
private PutItemSpec createPutItemSpec(PrimaryKey primaryKey, Map<String, String> keyValueMap, long expirationTime) { Item item = new Item().withPrimaryKey(primaryKey); // 直接遍历键值对写入Item,不需要做占位符转义 for (Map.Entry<String, String> entry : keyValueMap.entrySet()) { item.withString(entry.getKey(), entry.getValue()); } // 直接添加TTL属性,保留字仅在表达式场景下需要转义,直接写入Item不需要特殊处理 item.withLong(RESERVED_TTL_ATTRIBUTE, expirationTime); return new PutItemSpec().withItem(item); }
内容的提问来源于stack exchange,提问作者snakespan
相关产品推荐
相关产品推荐

