Cannot load data from DynamoDB due to an attribute of type List<Object> which is not able to get unconverted and was saved using @DynamoDBDocument

Viewed 15143

I am trying to save a List<CustomObject> using the @DynamoDBDocument but it gives me a DynamoDBMappingException : could not unconvert attribute.

Here is what my Entity class looks like -

@lombok.Data
@DynamoDBTable(tableName = "carTable")
public class Car {
   @DynamoDBHashKey(attributeName = "name")
   private carName;

   @DynamoDBRangeKey(attributeName = "model")
   private carModel;

   @DynamoDBAttribute(attributeName = "manufacturers")
   private List<Manufacturer> manufacturers;
}

The Manufacturer class looks like -

@lombok.Data
@DynamoDBDocument
public class Manufacturer {
    @DynamoDBAttribute
    private String manufacturerName;
}

When using this entity and saving the values into the table it saves properly as JSON, but when retrieving it, an exception is thrown -

com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: Car[manufacturers]; could not unconvert attribute
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperTableModel.unconvert(DynamoDBMapperTableModel.java:271)
[junit]     at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.privateMarshallIntoObject(DynamoDBMapper.java:456)
[junit]     at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.load(DynamoDBMapper.java:422)
[junit]     at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.load(DynamoDBMapper.java:433)
[junit]     at com.amazonaws.services.dynamodbv2.datamodeling.AbstractDynamoDBMapper.load(AbstractDynamoDBMapper.java:85)

What am I missing here, do I need to add some sort of TypeConverter or Marshaller here?

5 Answers

In my case, the issue was that the setters were missing

This was because I was using Lombok with @Builder and @Getter annotations only

If you use @Builder, you can still use @Tolerate to add default Constructor

In my case, my java class had an attribute as string, whereas dynamodb was storing it as a number. When I changed my attribute to be a int instead of a string, it worked smoothly.

Related