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

时间:2019-01-23 18:42:44

标签: java amazon-dynamodb aws-sdk

我使用DynamoDB映射器,并且具有以下Item.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在哪里转换为二进制值。

感谢您提供有关消除错误的帮助。

1 个答案:

答案 0 :(得分:0)

这是因为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;
}
};

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