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

Java操作DynamoDB列表追加报错:AttributeValue含空字符串求排查

解决DynamoDB列表追加时的ValidationException异常

这个错误提示已经把问题点得明明白白:你的:val1参数里包含了空字符串,而DynamoDB不允许任何属性值(包括嵌套在Map、列表里的字段)存在空字符串。

看你的代码,问题出在这一步:

Map<String, Object> map = objectMapper.convertValue(doc, Map.class);

当你把doc对象转成Map时,这个对象里有某个字段的取值是空字符串"",导致生成的map里带了空字符串值。后续把这个Map放到:val1的列表里,就触发了DynamoDB的验证规则——它会递归检查所有嵌套属性,绝对不允许空字符串存在。

解决办法

你可以从这几个方向处理:

1. 手动过滤Map里的空字符串

在把Map传入ValueMap之前,先移除所有值为空字符串的键值对:

Map<String, Object> map = objectMapper.convertValue(doc, Map.class);
// 过滤空字符串条目
Map<String, Object> filteredMap = new HashMap<>();
for (Map.Entry<String, Object> entry : map.entrySet()) {
    Object value = entry.getValue();
    if (!(value instanceof String && ((String) value).isEmpty())) {
        filteredMap.put(entry.getKey(), value);
    }
}
// 用过滤后的Map生成val1
ValueMap valueMap = new ValueMap().withList(":val1", Arrays.asList(filteredMap));

2. 配置Jackson自动忽略空字符串

如果业务上不需要保留空字符串字段,可以给ObjectMapper设置序列化规则,自动跳过空字符串:

objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
Map<String, Object> map = objectMapper.convertValue(doc, Map.class);

这样转出来的Map就不会包含空字符串的字段了。

3. 从源头避免空字符串

排查doc对象的生成逻辑,确认为什么会出现空字符串字段。如果是业务上不需要的空值,在生成doc时就用null代替(DynamoDB会自动忽略null属性,不会存储到表中)。

另外补充:你的UpdateExpression写法是完全没问题的,if_not_exists(doc_info_list, :empty_list)处理列表不存在的场景很合理,:empty_list的空列表也符合DynamoDB要求,问题完全出在:val1里的嵌套空字符串。

内容的提问来源于stack exchange,提问作者Nghia Do

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:42:29