首先说明下为什么要用case class,如果不用case class方式,通过普通的java bean也可以实现功能,但是在一些特定场合,比如想使用case class特性的时候就比较麻烦了。
普通的java bean通过dynamoDBMapper可以很简单的注入,只要添加对应的anotation即可,但是case class的anotation是无法直接在scal里识别出来,因为aws的dynamodb sdk是java 风格的, getters and setters 可识别已get或者is开头的字段,settter 可识别以set开头的字段,因此有两种方式,一种是构造java风格的,另外一种是在case class中使用对java bean的anotation提供对应的getter setter
方法一:
@DynamoDBTable(tableName = "mytable")
class MyClass {
private var id : Integer = _
@DynamoDBHashKey
def getId() = id
def setId(_id: Integer) = id = _id
}
方法二:
import annotation.meta.beanGetter
import beans.BeanProperty
import com.amazonaws.services.dynamodbv2.datamodeling._
@DynamoDBTable(tableName="mytable")
case class MyClass(
@(DynamoDBHashKey @beanGetter)
@BeanProperty var id:String,
@BeanProperty var number:Integer
) {
def this() = this(null, null)
}
下面定义方式可以支持Dynamodb mapper和批处理方式及S3读写方式
@DynamoDBTable(tableName = "mytable")
case class EventId(@(DynamoDBHashKey @beanGetter) @BeanProperty category:String, @(DynamoDBRangeKey @beanGetter) @BeanProperty eventid:String){
@DynamoDBHashKey(attributeName = "category") val _category = category
@DynamoDBRangeKey(attributeName = "eventid") val _eventid = eventid
}
如果有更好的写法,请分享