2013-06-12 73 views
8

Tôi đang gặp sự cố khi sử dụng DynamoDBMapper của Amazon trong mã Scala. Các điểm gắn bó chính là nhận được JVM để nhận @DynamoDBHashkey khi nó được sử dụng trong một lớp học trường hợp, như:Làm thế nào người ta có thể sử dụng DynamoDBMapper của Amazon ở Scala?

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

Bất kỳ con trỏ từ những người đã tích hợp thư viện khách hàng này thành một dự án Scala? (Tôi hy vọng không chỉ đơn giản là dự phòng cho API cấp thấp, mặc dù đó có thể là một quyết định đúng đắn một khi làm cạn kiệt các tùy chọn của tôi với Mapper).

Trả lời

9

Trình lập bản đồ DynamoDB sử dụng sự phản chiếu để tìm các getters và setters. SDK giả định các quy ước kiểu Java, tức là các getters và setters của bạn bắt đầu bằng "get" hoặc "is" và các setters bắt đầu bằng "set". Bạn có thể thấy mã phản chiếu on github.

tôi đã có thể để có được nó làm việc, nhưng nó cảm thấy giống như viết Java :(

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

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

tôi phải làm điều này:

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 là "chính thức" đường tương tác với bất kỳ thư viện phản ánh nào mà bạn mong đợi tuân theo các quy ước JavaBeans – Tacroy

+0

Cảm ơn phản hồi rất hữu ích này! Tôi đã gặp phải một số vấn đề khi sử dụng các giá trị Boolean.Đặc biệt, dòng '@BooleanBeanProperty var rockstar: Boolean = true' sẽ viết DynamoDb trường 'rockstar' đúng, nhưng tôi không t có thể lấy thuộc tính được đặt tên là 'isRockstar'. Nếu tôi thử '@BooleanBeanProperty var isRockstar: Boolean = true', trình ánh xạ ghi cả' rockstar' và 'isRockstar'. Thêm '@DynamoDBAttribute (attributeName =" isRockstar ")' ở trên cũng không giúp được gì. Có suy nghĩ gì không? –

+1

@JoshPadnick xem phần câu trả lời của MattE ở trên: SDK giả định các quy ước kiểu Java, tức là getters và setters của bạn bắt đầu bằng "get" hoặc "is". Tôi không nghĩ rằng bạn có thể đặt tên cho bất động sản của bạn bắt đầu bằng 'is'. –