Я разрабатываю приложение для Android с использованием Kotlin.Для бэкэнда я использую Dynamo DB и Cognito Service.Для создания элемента в базе данных Dynamo ранее я использовал Document, как показано ниже.
fun createItem()
{
thread(start = true){
val credentialsProvider = CognitoCachingCredentialsProvider(
activity, MainApplication.COGNITO_IDENTITY_POOL_ID, MainApplication.AWS_REGION)
val dbClient = AmazonDynamoDBClient(credentialsProvider);
val dbItemTable = Table.loadTable(dbClient, MainApplication.DB_TABLE_ITEMS)
val item: Document = Document()
if (!item.containsKey("Id")) {
item.put("Id", credentialsProvider.getCachedIdentityId() + UUID.randomUUID())
}
if (!item.containsKey("UserId")) {
item.put("UserId", credentialsProvider.getCachedIdentityId())
}
if (!item.containsKey("Name")) {
item.put("Name", contentView.item_tf_name.text.toString())
}
if (!item.containsKey("Description")) {
item.put("Description", contentView.item_tf_description.toString())
}
dbItemTable.putItem(item)
}
}
Приведенный выше код работает нормально.Но я хотел использовать DynamoDBMapper и связать таблицу с классом Kotlin.
Поэтому я создал класс для сопоставления с таблицей со следующим определением
@DynamoDBTable(tableName = "xxxx-3302xx-item")
class ItemDO {
@get:DynamoDBHashKey(attributeName = "Id")
@get:DynamoDBAttribute(attributeName = "Id")
var id: String? = null
@get:DynamoDBAttribute(attributeName = "Description")
var description: String? = null
@get:DynamoDBAttribute(attributeName = "Name")
var name: String? = null
@get:DynamoDBAttribute(attributeName = "UserId")
var userId: String? = null
}
Затем я изменил свой createItem,Это определение
fun createItem()
{
thread(start = true){
val cognitoCredentialsProvider = CognitoCachingCredentialsProvider(activity, MainApplication.COGNITO_IDENTITY_POOL_ID, MainApplication.AWS_REGION)
AWSMobileClient.getInstance().initialize(activity, object : AWSStartupHandler {
override fun onComplete(awsStartupResult: AWSStartupResult) {
// Add code to instantiate a AmazonDynamoDBClient
val dynamoDBClient = AmazonDynamoDBClient(AWSMobileClient.getInstance().credentialsProvider)
val dbMapper = DynamoDBMapper.builder()
.dynamoDBClient(dynamoDBClient)
.awsConfiguration(
AWSMobileClient.getInstance().configuration)
.build()
val item = ItemDO()
item.id = UUID.randomUUID().toString() + UUID.randomUUID().toString()
item.name = view?.item_tf_name?.text.toString()
item.description = view?.item_tf_description?.text.toString()
item.userId = cognitoCredentialsProvider.cachedIdentityId
dbMapper.save(item, DynamoDBMapperConfig(DynamoDBMapperConfig.SaveBehavior.UPDATE_SKIP_NULL_ATTRIBUTES))
}
}).execute()
}
}
Но когда я вызвал функцию, это выдает мне эту ошибку.
Process: com.thegoodyard.waiyanhein.thegoodyard, PID: 18353
com.amazonaws.AmazonServiceException: One or more parameter values were invalid: Missing the key Id in the item (Service: AmazonDynamoDB; Status Code: 400; Error Code: ValidationException; Request ID: 6N9KPON73BG135594S7GBV11IFVV4KQNSO5AEMVJF66Q9ASUAAJG)
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:730)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:405)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:212)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:4182)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.putItem(AmazonDynamoDBClient.java:1370)
at com.amazonaws.mobileconnectors.dynamodbv2.document.Table.putItem(Table.java:280)
at com.amazonaws.mobileconnectors.dynamodbv2.document.Table.putItem(Table.java:261)
at com.thegoodyard.waiyanhein.thegoodyard.ItemFormFragment$createItem$1.invoke(ItemFormFragment.kt:75)
at com.thegoodyard.waiyanhein.thegoodyard.ItemFormFragment$createItem$1.invoke(ItemFormFragment.kt:16)
at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)
Но у меня есть свойство сопоставлять Id в определении класса.Что не так с моим кодом и как я могу это исправить?