Reputation: 726
I have this error while saving a new item (WCode
) into a DynamoDB instance by using DynamoDBMapper
:
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)
I guest it's something related to the key attributes on the WCode
class but I can't really understand which one and how to search for additional details problem.
The following is the WCode
model class and all the attributes names are correctly reported:
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;}
}
This is the method I use to store the item (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 using aws-java-sdk-dynamodb
and aws-java-sdk-sqs
(the latter for another part of the project) version 1.10.58
.
Does someone can point me to a possible solution or suggestion?
Thank you very much!
Upvotes: 3
Views: 1516
Reputation: 66
I had the same problem. I've resolved using batchSave function instead of save:
mapper.batchSave(Arrays.asList(tmpCode));
It worked for me.
Upvotes: 4