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
相关产品推荐
相关产品推荐

