You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 17:22:19