【问题标题】:DynamoDBMappingException no HASH key for GSIDynamoDBMappingException 没有 GSI 的 HASH 键
【发布时间】:2017-06-27 07:52:57
【问题描述】:

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 密钥”的谷歌搜索结果,这就是我受到启发创建这篇文章的原因。

【问题讨论】:

    标签: java amazon-dynamodb


    【解决方案1】:

    这是 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 中大小写的不同。

    总结一下 - 如果您收到此错误 - 双重、三重和四重检查与索引名称相关的所有注释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多