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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 01:09:03