2017-10-21 25 views
0

私は、ScanamoライブラリからDynamoDBを使用しようとしています。私のScalaのコードは次のようになります。DynamoDB/Scanamo:提供されたキー要素がスキーマと一致しません

package my.package 

import com.amazonaws.ClientConfiguration 
import com.amazonaws.regions.{Region, Regions} 
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient 
import com.gu.scanamo._ 
import com.gu.scanamo.syntax._ 
import com.amazonaws.auth.{AWSStaticCredentialsProvider, BasicAWSCredentials} 
import com.amazonaws.services.dynamodbv2.datamodeling._ 

object MusicService { 

    def main(args: Array[String]): Unit = { 
    val musicService = new MusicService 
    musicService.getAlbums() 
    } 

} 

class MusicService { 

    def getAlbums() { 

    val awsCreds = new BasicAWSCredentials("my","creds") 
    val client = AmazonDynamoDBClient 
     .builder() 
     .withRegion(Regions.EU_WEST_2) 
     .withCredentials(new AWSStaticCredentialsProvider(awsCreds)) 
     .build(); 


    case class Music(@DynamoDBIndexRangeKey(attributeName = "Artist") 
     artist: String, @DynamoDBIndexHashKey(attributeName = "SongTitle") songTitle: String); 

    val table = Table[Music]("Music") 

    val putOp = table.putAll(Set(
     Music("The Killers", "Sam's Town"), 
     Music("The Killers", "Spaceman") 
    )) 
    Scanamo.exec(client)(putOp) 

} 

私はputOp execingでこのエラーを取得しています:

Exception in thread "main" com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException: The provided key element does not match the schema (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: 0KAFH90JO39COO143LC5H6RPPNVV4KQNSO5AEMVJF66Q9ASUAAJG) 
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1638) 
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1303) 
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1055) 
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743) 
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717) 
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699) 
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667) 
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649) 
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513) 
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.doInvoke(AmazonDynamoDBClient.java:2186) 
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:2162) 
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.executeBatchWriteItem(AmazonDynamoDBClient.java:575) 
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.batchWriteItem(AmazonDynamoDBClient.java:551) 
at com.gu.scanamo.ops.ScanamoInterpreters$$anon$1.apply(ScanamoInterpreters.scala:51) 
at com.gu.scanamo.ops.ScanamoInterpreters$$anon$1.apply(ScanamoInterpreters.scala:30) 
at cats.free.Free.$anonfun$foldMap$1(Free.scala:126) 
at cats.package$$anon$1.tailRecM(package.scala:41) 
at cats.free.Free.foldMap(Free.scala:124) 
at cats.free.Free.$anonfun$foldMap$1(Free.scala:127) 
at cats.package$$anon$1.tailRecM(package.scala:41) 
at cats.free.Free.foldMap(Free.scala:124) 
at com.gu.scanamo.Scanamo$.exec(Scanamo.scala:17) 
at my.package.MusicService.getAlbums(MusicService.scala:39) 
at my.package.MusicService$.main(MusicService.scala:14) 
at my.package.MusicService.main(MusicService.scala) 

DynamoDBの上の私のテーブル構造が非常に簡単で、次のようになります。

Table name: Music 
Partition key: Artist 
Sort key: SongTitle 

それだけです。

なぜこれが失敗しているのか、私はそれを修正するために何ができるのですか?

答えて

0

あなたは(@DynamoDBIndexHashKeyは、ハッシュキーのためにあるべきな - アーティストとソートキーの@DynamoDBIndexRangeKey - songTitle)@DynamoDBIndexHashKey@DynamoDBIndexRangeKeyを交換する必要がまず第一。

また、Artistはパーティションキーで、SongTitleはソートキーであると述べました。なぜ@DynamoDBIndexHashKey@DynamoDBIndexRangeKeyを使用するのですか?代わりに@DynamoDBHashKey@DynamoDBRangeKeyが必要です(アーティストとsongTitleがインデックスでない場合に備えて)。

+0

返信いただきありがとうございます。私は間違った注釈を使用していました。しかし、アノテーションは尊重されていなかったので、私はまだ同じ問題に取り組んでいます。 caseクラスのフィールド名をDynamoDBテーブルのフィールド名に変更することで回避策がありますが、理想的ではありません。 'case class Music(Artist:String、SongTitle:String)' – user3864189

関連する問題