2013-06-12 62 views
8

我在Scala代碼中使用Amazon的DynamoDBMapper時遇到了問題。主要癥結是越來越認識到@DynamoDBHashkey JVM時它在一個案例類使用,如:如何在Scala中使用Amazon的DynamoDBMapper?

case class MyCoolCaseClass(@DynamoDBHashKey(attributeName = "my_id") myId: String) {}

從別人任何指針誰已經集成了這個客戶端庫到Scala的項目? (我希望不要簡單地回退到低級API,儘管這可能是一個體面的決定,一旦耗盡了Mapper的選擇)。

回答

9

DynamoDB映射器使用反射來查找獲取器和設置器。 SDK採用Java風格的約定,即您的getter和setter以「get」或「is」開頭,setter以「set」開頭。您可以看到反射代碼on github

我已經能夠得到它的工作,但感覺就像編寫Java :(

@DynamoDBTable(tableName = "awesome_table") 
class TheBestClass { 
    private var id : Integer = _ 

    @DynamoDBHashKey 
    def getId() = id 
    def setId(_id: Integer) = id = _id 
} 
9

我不得不這樣做:

import annotation.meta.beanGetter 
import beans.BeanProperty 

import com.amazonaws.services.dynamodbv2.datamodeling._ 

@DynamoDBTable(tableName="DEMOTAB") 
case class DemoItem( // it's a case class for the free stuff, but can be ordinary class 
    @(DynamoDBHashKey @beanGetter) // would not work without meta annotation 
    @BeanProperty var id:String, // must be var or mapper can't instantiate one 

    @BeanProperty var number:Integer 
) { 
    def this() = this(null, null)  // needed by DynamoDB Mapper to instantiate 
} 
+3

@BeanProperty是「官方」的方式與任何反射庫進行交互,期望您遵循JavaBeans約定 – Tacroy

+0

感謝這個非常有幫助的響應!當使用布爾值時,我遇到了一些問題,具體來說,'@BooleanBeanProperty var rockstar:Boolean = true'會寫入DynamoDb字段'rockstar'正確,但我不是能夠獲得被命名爲'isRockstar'的財產。如果我嘗試'@BooleanBeanProperty var isRockstar:Boolean = true',映射器將同時寫入'rockstar'和'isRockstar'。上面添加'@DynamoDBAttribute(attributeName =「isRockstar」)'也沒有幫助。有什麼想法嗎? –

+1

@JoshPadnick參見上文MattE的回答正文:SDK採用Java風格的約定,即您的getter和setter以「get」或「is」開頭。我不認爲你可以用'is'開頭來命名你的財產。 –