Dynamo抛出的这个错误非常模糊,但有一种方法可以快速缩小问题范围。可以在https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-dynamodb/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapperTableModel.java
找到引发此错误的代码目前唯一的谷歌搜索结果是"没有用于GSI的HASH密钥"这就是为什么我被激发创造这篇文章的原因。
答案 0 :(得分:1)
这是DynamoDB Java Library中最重要的代码:
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索引名称声明中是错误的,或者注释在使用DynamoDBIndexHashKey
注释GSI的DynamoDBTable类中是错误的。
就我个人而言,存在极小的差异:我的userId-Index
请求中定义了CreateTable
,但该字段已注明userId-index
。请注意Index
中的大小写不同。
总而言之 - 如果您收到此错误 - 请检查与索引名称相关的所有注释的double,triple和quadruple。