这是 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 索引名称声明中是错误的,或者在 GSI 用 DynamoDBIndexHashKey 注释的 DynamoDBTable 类中的注释是错误的。
就我个人而言,存在一个非常小的差异:userId-Index 是在我的 CreateTable 请求中定义的,但该字段被注释为 userId-index。注意Index 中大小写的不同。
总结一下 - 如果您收到此错误 - 双重、三重和四重检查与索引名称相关的所有注释。