Использование DynamoDBMapper вызывает ошибку в Kotlin Android - PullRequest
0 голосов
/ 30 сентября 2018

Я разрабатываю приложение для 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 в определении класса.Что не так с моим кодом и как я могу это исправить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...