2017-10-21 1 views
0

저는 Scanamo 라이브러리를 통해 DynamoDB를 사용하려고했습니다. 내 스칼라 코드는 다음과 같습니다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 

그게 전부입니다.

왜 이것이 실패하고 내가 해결할 수 있는지에 대한 안내를 해 주실 수 있습니까?

당신이 @DynamoDBIndexHashKey@DynamoDBIndexRangeKey 교체하는 데 필요한 모든의

답변

0

먼저 (@DynamoDBIndexHashKey 같은 해시 키를해야한다 - 종류의 키에 대한 아티스트 및 @DynamoDBIndexRangeKey - songTitle).

아티스트는 파티션 키이고 SongTitle은 정렬 키입니다. 그렇다면 @DynamoDBIndexHashKey@DynamoDBIndexRangeKey을 사용하는 이유는 무엇입니까? 대신 @DynamoDBHashKey@DynamoDBRangeKey이 필요합니다 (아티스트 및 songTitle이 색인이 아닐 경우).

+0

답장을 보내 주셔서 감사합니다. 잘못된 주석을 사용하고있었습니다. 그러나 주석이 존중되지 않았더라도 관계없이 동일한 문제가 발생했습니다. case 클래스의 필드 이름을 DynamoDB 테이블의 필드 이름과 일치하도록 변경했는데 이상이 아닙니다. 'case class Music (Artist : String, SongTitle : String)' – user3864189

관련 문제