我正在使用DynamoDB SDK 1.11.185版本。我有一个客户端实体通过DynamoDBMapper注释映射到Clients DynamoDB表。其中一个属性包含嵌套值(请参阅下面的代码示例)。我想从Options类向zone属性添加本地二级索引。一旦我想保存一个对象,我从这个类
得到一个空指针异常com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperTableModel
第415行。看起来是图书馆的一个错误。
Pd积。如果我从Client实体生成clientId属性索引,一切正常。
@DynamoDBTable(tableName="Clients")
public class Client {
private String id;
private String clientId;
private Date created;
private Options options;
public Client() {
}
public Client(String id, String clientId, Options options) {
this.id = id;
this.clientId = clientId;
this.options = options;
this.created = new Date();
}
@DynamoDBHashKey
public String getId() { return id; }
public void setId(String id) { this.id = id; }
@DynamoDBAttribute
public String getClientId() { return clientId; }
public void setClientId(String clientId) { this.clientId = clientId; }
@DynamoDBAttribute
public Options getOptions() { return options; }
public void setOptions(Options options) { this.options = options; }
@DynamoDBRangeKey
public Date getCreated() { return created; }
public void setCreated(Date created) { this.created = created; }
}
@DynamoDBDocument
public class Options {
private String zone;
public Options() {
}
public Options(String zone) {
this.zone = zone;
}
@DynamoDBIndexRangeKey(localSecondaryIndexName = "zone-index")
public String getZone() { return zone; }
public void setZone(String zone) { this.zone = zone; }
}
****************************编辑****************** *******
@Raniz及其正确答案 Indexing on nested field
可以使用JSON属性完成: DynamoDB create index on map or list type
答案 0 :(得分:1)
您不能在索引的密钥架构中使用嵌套属性。
我假设您已经在架构中使用 options.zone 创建了索引,这意味着DynamoDB期望具有该确切名称的顶级属性 - 即名为的属性options.zone ,而不是嵌套在选项属性下的名为 zone 的属性。
摘自here:
索引的关键架构。索引键架构中的每个属性 必须是String,Number或Binary类型的顶级属性。其他 不允许使用数据类型,包括文档和集合。密钥模式的其他要求取决于索引的类型:
对于全局二级索引,分区键可以是基表的任何标量属性。排序键是可选的,它也可以 基表的任何标量属性。
对于本地二级索引,分区键必须与基表的分区键相同,并且排序键必须是非键 基表属性。
要在索引架构中使用 zone ,您需要移动或复制它,以便它可以在顶层使用。完成此操作的最简单方法可能是向Client
添加一个返回options.zone
的getter:
@DynamoDBIndexRangeKey(localSecondaryIndexName = "zone-index")
public String getZone() {
if (options != null) {
return options.getZone();
}
return null;
}