索引键的类型不匹配 人员 ID 预期:S 实际 B DynamoDB 在 Java 中保存错误



我使用 DynamoDB 映射器,我有以下项目.class。这些值使用 KMS 密钥进行加密。

public class Item {
private String id
private String personID;
@DynamoDBHashKey
@DynamoDBGeneratedUuid(DynamoDBAutoGenerateStrategy.CREATE)
public String getId(){
    return id;
}
@DynamoDBAttribute
@DynamoDBIndexHashKey(globalSecondaryIndexName = "personID-index")
public String getPersonID() {
    return personID;
}
};

当我尝试保存项目时,它给我以下错误

AmazonDynamoDBException: One or more parameter values were invalid: Type mismatch for Index Key personID Expected: S Actual: B IndexName: personID-index

尽管错误说我将其作为 B 发送,但根据我的代码,它是一个字符串值,即 S。

根据 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.DataTypes.html S - 字符串和 B 是二进制的。我看不到我的 personID 在哪里转换为二进制值。

任何关于摆脱错误的帮助将不胜感激。

这是因为PersonID是使用KMS密钥加密的。您可以具体说明不要使用@DoNotTouch注释对属性进行签名或加密。

public class Item {
private String id
private String personID;
@DynamoDBHashKey
@DynamoDBGeneratedUuid(DynamoDBAutoGenerateStrategy.CREATE)
public String getId(){
    return id;
}
@DoNotTouch
@DynamoDBAttribute
@DynamoDBIndexHashKey(globalSecondaryIndexName = "personID-index")
public String getPersonID() {
    return personID;
}
};

如果您希望加密密钥,您还可以进行服务器端加密 https://aws.amazon.com/about-aws/whats-new/2018/02/amazon-dynamodb-now-supports-server-side-encryption-at-rest/,因为 DynamoDB 现在支持服务器端静态加密。