2016-04-05 7 views
2

Ich habe diesen Fehler während ein neues Objekt speichern (WCode) in eine DynamoDB Instanz von DynamoDBMapper mit:Validation während mit Mapper auf DynamoDB Speicher

Exception in thread "Thread-1" com.amazonaws.AmazonServiceException: The provided key element does not match the schema (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: 4OOMKU7NS1VD19EN988SUUM3U7VV4KQNSO5AEMVJF66Q9ASUAAJG) 
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1369) 
    at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:913) 
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:631) 
    at com.amazonaws.http.AmazonHttpClient.doExecute(AmazonHttpClient.java:400) 
    at com.amazonaws.http.AmazonHttpClient.executeWithTimer(AmazonHttpClient.java:362) 
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:311) 
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:1966) 
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.updateItem(AmazonDynamoDBClient.java:1780) 
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$SaveObjectHandler.doUpdateItem(DynamoDBMapper.java:1110) 
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$2.executeLowLevelRequest(DynamoDBMapper.java:806) 
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$SaveObjectHandler.execute(DynamoDBMapper.java:989) 
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.save(DynamoDBMapper.java:835) 
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.save(DynamoDBMapper.java:669) 
    at com.wkt.cdmng.MessageAnalyzer.storeCode(MessageAnalyzer.java:220) 
    at com.wkt.cdmng.MessageAnalyzer.run(MessageAnalyzer.java:156) 
    at java.lang.Thread.run(Thread.java:745) 

ich Gast ist es etwas auf die wichtigsten Attribute der WCode Klasse verwendet aber ich kann nicht wirklich verstehen, welches und wie man nach weiteren Details sucht.

Das folgende ist die WCode Modellklasse und alle Attribute Namen korrekt gemeldet werden:

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; 
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; 
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBIndexHashKey; 
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; 
import java.util.Date; 

@DynamoDBTable(tableName = "CODES_DEV") 
public class WCode { 
    private String id; 
    private String code; 
    private String extra; 

    @DynamoDBHashKey(attributeName = "ID") 
    public String getId() {return id;} 
    public void setId(String code) {id = "0|" + code + "|" + String.valueOf(new Date().getTime());} 

    @DynamoDBIndexHashKey(globalSecondaryIndexName = "CD-index", attributeName = "CD") 
    public String getCode() {return code;} 
    public void setCode(String code) {this.code = code;} 

    @DynamoDBAttribute(attributeName = "EX") 
    public String getExtra() {return extra;} 
    public void setExtra(String extra) {this.extra = extra;} 
} 

Dies ist die Methode, die ich um das Element zu speichern, verwenden (storeCode):

private void storeCode(String code) { 
    DynamoDBMapper mapper = awsDynamo.getMapper(); // singleton class I use to connect to DynamoDB 
    WCode tmpCode = new WCode(); 
    tmpCode.setId(code); 
    tmpCode.setCode(code); 
    tmpCode.setExtra(""); 
    mapper.save(tmpCode); 
} 

I‘ m unter Verwendung von aws-java-sdk-dynamodb und aws-java-sdk-sqs (letztere für einen anderen Teil des Projekts) Version 1.10.58.

Kann mich jemand auf eine mögliche Lösung oder einen Vorschlag hinweisen?

Vielen Dank!

+0

Haben Sie die Keynames von WCode Klasse mit den keynamens in Ihrem DynamoDB in aws verglichen? Wie ich mich erinnere, sind sie Groß-und Kleinschreibung –

+0

Sie haben Recht; Ich habe es getan, sie scheinen korrigiert zu sein. – Marco

+0

Jetzt funktioniert es? –

Antwort

1

Ich hatte das gleiche Problem. Ich habe mit batchSave aufgelöst Funktion stattdessen speichern von

mapper.batchSave(Arrays.asList(tmpCode)); 

Es ist Arbeit für mich