DynamoDBMapper加载无法实例化Kotlin数据类

时间:2018-06-28 00:30:18

标签: kotlin aws-lambda amazon-dynamodb

使用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有一个Android示例,该示例使用com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper而不是com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper。我尝试了Android版本,但结果却是相同的。

https://docs.aws.amazon.com/aws-mobile/latest/developerguide/add-aws-mobile-nosql-database.html

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

DynamoDBMapper期望一个带有空构造函数的类。使用Kotlin数据类,可以为所有参数指定默认值,并使用@JvmOverload,这将为JVM(Java)生成空的构造函数。另外,所有参数都必须是可变的,因此您需要使用“ var”而不是“ val”。

@DynamoDBTable(tableName = "Test")
data class TestItem @JvmOverloads constructor(

   @DynamoDBHashKey(attributeName="someKey")
   var someKey: String = "",

   var someValue: String = ""
)

答案 1 :(得分:0)

如果您使用的是lombok Builder,请尝试以下操作

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
DynamoDBTable(tableName = "Test")
public class TestItem {

   @DynamoDBHashKey(attributeName="someKey")
   var someKey: String = "",

}