如何使用Java AWS SDK v2将Kotlin数据类写入DynamoDB?
解决Kotlin数据类转DynamoDB AttributeValue的类型不匹配问题
直接修复当前代码错误
你的代码中"count" to AttributeValue.builder().n(count)这一行遗漏了.build()方法,导致该元素的类型为AttributeValue.Builder而非AttributeValue,这是触发类型不匹配错误的直接原因。补全.build()后即可解决该报错:
val items = mapOf( "id" to AttributeValue.builder().s(id).build(), "key" to AttributeValue.builder().s(key).build(), "count" to AttributeValue.builder().n(count).build(), // 补全build() "ts" to AttributeValue.builder().n(ts).build(), "version" to AttributeValue.builder().n(version).build() )
更优雅的解决方案:使用DynamoDB Enhanced Client
手动构建AttributeValue容易出现遗漏或类型错误,推荐使用AWS SDK v2的DynamoDB Enhanced Client实现Kotlin数据类与DynamoDB条目的自动映射,无需手动处理类型转换。
步骤1:添加依赖
以Gradle为例,在build.gradle.kts中添加依赖:
implementation("software.amazon.awssdk:dynamodb-enhanced:2.20.0")
步骤2:给数据类添加映射注解
通过注解指定数据类与DynamoDB表的映射关系:
import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbBean import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbPartitionKey @DynamoDbBean data class Bar(val value1: String, val value2: String){ override fun toString(): String{ return "$value1.$value2" } } @DynamoDbBean data class Foo( @get:DynamoDbPartitionKey // 根据你的表结构,标记分区键或排序键 val id: Bar, val key: String, val count: Int, val ts: Long, val version: Int )
步骤3:使用Enhanced Client插入数据
借助Enhanced Client直接操作数据类,无需手动构建AttributeValue:
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient import software.amazon.awssdk.enhanced.dynamodb.TableSchema // 初始化Enhanced Client,传入已有的DynamoDbClient实例 val enhancedClient = DynamoDbEnhancedClient.builder() .dynamoDbClient(dynamoDB) .build() // 获取对应表的操作对象 val fooTable = enhancedClient.table(tableName, TableSchema.fromBean(Foo::class.java)) // 构造数据并插入 val foo = Foo( id = Bar("val1", "val2"), key = "demo-key", count = 3, ts = System.currentTimeMillis(), version = 1 ) fooTable.putItem(foo)
手动映射的注意事项
如果坚持手动构建AttributeValue,除了确保所有AttributeValue.Builder都调用.build()外,还需注意:
- 所有数字类型(Int、Long等)需要转换为字符串后传入
.n()方法 - 自定义类型(如
Bar)可通过toString()转为字符串存储,或拆分为多个独立属性存入DynamoDB,具体取决于业务需求
内容的提问来源于stack exchange,提问作者CyberPunk
相关产品推荐
相关产品推荐

