下面是来自DynamoDB的Java库中最重要的代码:
for (final DynamoDBMapperFieldModel<T,Object> field : fields.values()) {
for (final String indexName : field.globalSecondaryIndexNames(RANGE)) {
final GlobalSecondaryIndex gsi = map.get(indexName);
if (gsi == null) {
throw new DynamoDBMappingException(
targetType.getSimpleName() + "[" + field.name() + "]; no HASH key for GSI " + indexName
);
}
gsi.withKeySchema(new KeySchemaElement(field.name(), RANGE));
}
}
通知调用final GlobalSecondaryIndex gsi = map.get(indexName);
。 DynamoDB正在尝试使用您在注释中定义的索引名称来查询包含该对象值的映射,并且它将显示为null。当地图中不存在值时,null始终是来自java地图的响应,但您仍然要求它。
这应该提示我们。值的映射中的indexName
条目没有映射或没有与其关联的值。这意味着indexName
在GlobalSecondaryIndex的索引名称的表的声明中出现错误,或者在DynamoDBTable类中使用DynamoDBIndexHashKey
对GSI进行了注释时,注释是错误的。
对我个人而言,有一个非常小的差异:userId-Index
被定义在我的CreateTable
请求中,但该字段被注释为userId-index
。请注意0中套管的不同。
因此,总结 - 如果您收到此错误 - 双重,三重和四重检查所有与索引名称相关的注释。