kotlin - DynamoDBMapper 加载无法实例化 Kotlin 数据类
问题描述
在用 Kotlin 编写的 AWS Lambda(即不是 Android)中使用 DynamoDBMapper,我可以使用数据类保存记录。但是,当我尝试将记录加载到数据类时,我收到“DynamoDBMappingException:无法实例化类”异常。
@DynamoDBTable(tableName = "Test")
data class TestItem(
@DynamoDBHashKey(attributeName="someKey")
@DynamoDBAttribute(attributeName = "someKey")
var someKey: String?,
@DynamoDBAttribute(attributeName = "someValue")
var someValue: String?
}
val ddbMapper = DynamoDBMapper(AmazonDynamoDBClientBuilder.defaultClient())
ddbMapper.load(TestItem::class.java, "xyz")
导致以下异常:
com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException:无法实例化类 com.intuit.connect_to_pro.lambda_common_core.aws_service.TestItem
根本例外是:
java.lang.NoSuchMethodException: com.intuit.connect_to_pro.lambda_common_core.aws_service.TestItem.()
AWS 有一个使用 com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper 而不是 com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper 的 Android 示例。我尝试了Android版本,但结果是一样的。
https://docs.aws.amazon.com/aws-mobile/latest/developerguide/add-aws-mobile-nosql-database.html
任何帮助,将不胜感激。
解决方案
DynamoDBMapper 需要一个具有空构造函数的类。使用 Kotlin 数据类,您可以为所有参数指定默认值并使用 @JvmOverload,这将为 JVM (Java) 生成空构造函数。此外,所有参数都需要是可变的,因此您需要使用“var”而不是“val”。
@DynamoDBTable(tableName = "Test")
data class TestItem @JvmOverloads constructor(
@DynamoDBHashKey(attributeName="someKey")
var someKey: String = "",
var someValue: String = ""
)
推荐阅读
- java - 如何在android中为透明png图像添加描边/边框?
- apache - 如何横向扩展 apache 地图集
- javascript - React & Browserify:我有延迟加载的选项吗?
- android - 如何在android中获取BottomNavigationView的SelectedItemId
- amazon-web-services - When I am trying to create a pipeline in amazon elastic transcoder using amazon console with IAM it gives me an error
- javascript - 在对象中找到键值
- java - How to dynamically change a list value to another list in Java or Groovy
- javascript - 如何使用 IE11、Chrome 71、Firefox 62(Quantum)等最新浏览器版本获取 iframe 的 innerHTML
- javascript - Electron 的本地存储没有将我的点击事件保存在动态创建的元素上
- php - How to get value of 1 associative array by using the value in another array?