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

Spring Data DynamoDB仅save可用,其他方法抛NoSuchMethodException

问题根源

从堆栈信息可明确:AWS DynamoDBMapper反序列化实体时要求类提供无参构造函数,但你的Kotlin数据类MyEntity未生成无参构造,导致抛出NoSuchMethodException。

save方法能正常执行是因为保存时直接使用已创建的实体对象,无需反序列化;而findById、deleteAll等方法需要从DynamoDB读取数据并反序列化为实体,此时必须调用无参构造初始化实例。

解决方案

1. 给Kotlin数据类添加无参构造函数

Kotlin数据类默认不生成无参构造,可通过以下两种方式实现:

方式一:给所有字段指定默认值

@DynamoDBTable(tableName = "your-table-name") // 建议显式指定表名,避免映射错误
data class MyEntity(
    @field:DynamoDBHashKey
    @field:DynamoDBAttribute
    val id: String = "", // 主键字段添加默认值
    // 其他字段同样设置默认值
    val otherField: String = ""
)

这种方式下Kotlin会自动生成无参构造函数,满足DynamoDBMapper的要求。

方式二:显式定义次级构造函数

如果不想给所有字段加默认值,可通过次级构造实现:

@DynamoDBTable(tableName = "your-table-name")
data class MyEntity(
    @field:DynamoDBHashKey
    @field:DynamoDBAttribute
    val id: String,
    val otherField: String
) {
    constructor() : this("", "") // 显式定义无参构造,调用主构造并传入默认值
}

2. 关于derjust依赖的补充说明

若后续想切换到derjust的spring-data-dynamodb,需在配置类中显式指定Repository扫描路径,否则会出现“found 0 dynamodb interfaces”错误:

@Configuration
@EnableDynamoDBRepositories(basePackages = "mypackagemigration.repository") // 替换为你的Repository包路径
public class DynamoDBConfig {
    // 配置DynamoDBMapper等必要Bean
}
验证步骤

修改实体类后,重新调用findById、deleteAll等方法,即可正常执行,不会再抛出NoSuchMethodException。

内容的提问来源于stack exchange,提问作者Juliette

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:45:00