2013-06-12 13 views
8

Ho problemi con l'utilizzo di Amazon DynamoDBMapper nel codice Scala. Il punto critico principale è sempre la JVM di riconoscere @DynamoDBHashkey quando viene utilizzato in una classe caso, come:Come si può usare DynamoDBMapper di Amazon in Scala?

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

Tutti gli indicatori da qualcuno che ha integrato questa libreria client in un progetto Scala? (Spero di non ricorrere semplicemente all'API di basso livello, anche se questa potrebbe essere una decisione decente una volta esaurita le mie opzioni con il Mapper).

risposta

9

Il mappatore DynamoDB utilizza la riflessione per trovare getter e setter. L'SDK assume le convenzioni in stile Java, cioè che i getter e i setter iniziano con "get" o "is" e i setter iniziano con "set". È possibile vedere il codice di riflessione on github.

Sono stato in grado di farlo funzionare, ma ci si sente proprio come la scrittura Java :(

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

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

ho dovuto fare questo:

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 è il modo "ufficiale" di interagire con qualsiasi libreria di riflessioni che si aspetta di seguire le convenzioni di JavaBeans – Tacroy

+0

Grazie per questa risposta molto utile! Ho riscontrato alcuni problemi durante l'utilizzo di valori booleani.In particolare, la riga '@BooleanBeanProperty var rockstar: Boolean = true' scriverà il DynamoDb campo 'rockstar' correttamente, ma io sono no t in grado di ottenere il nome della proprietà 'isRockstar'. Se provo '@BooleanBeanProperty var isRockstar: Boolean = true', il mapper scrive sia' rockstar' che 'isRockstar'. Aggiungere '@DynamoDBAttribute (attributeName =" isRockstar ")' in alto non aiuta neanche. qualche idea? –

+1

@JoshPadnick vedi il corpo della risposta di MattE sopra: L'SDK assume convenzioni in stile Java, cioè che i tuoi getter e setter iniziano con "get" o "is". Non penso che tu possa nominare la tua proprietà iniziando con 'is'. –

Problemi correlati