Marco
Marco

Reputation: 726

ValidationException while saving on DynamoDB with mapper

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

Answers (1)

Andrea Ciaccia
Andrea Ciaccia

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

Related Questions