Несоответствие типов для ключа индекса PersonID Ожидается: S Фактический B Ошибка сохранения DynamoDB в Java - PullRequest
0 голосов
/ 23 января 2019

Я использую DynamoDB mapper и у меня есть следующий 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 голосов
/ 24 января 2019

Это потому, что 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 теперь поддерживает шифрование на стороне сервера в состоянии покоя.https://aws.amazon.com/about-aws/whats-new/2018/02/amazon-dynamodb-now-supports-server-side-encryption-at-rest/

...