0

I am using the enum as the partition key and my model looks like below

@DynamoDbBean
public class Item {

    public enum Key {
        KEY_A(false),
        KEY_B(2),

        private final Object defaultValue;

        private Key(Object defaultValue) {
            this.defaultValue = defaultValue;
        }

        public Object getDefaultValue() {
            return this.defaultValue;
        }
    }

    private Key key;
    private Object value;

    public Item() {

    }

    public Item(Key key) {
        this.key = key;
        this.value = key.getDefaultValue();
    }

    @DynamoDbConvertedBy(KeyEnumConverter.class)
    @DynamoDbPartitionKey
    public Key getKey() {
        return key;
    }

    public void setKey(Key key) {
        this.key = key;
    }

    @DynamoDbConvertedBy(ValueConverter.class)
    public Object getValue() {
        return value;
    }

    public void setValue(Object value) {
        this.value = value;
    }
}

My Converter classes to convert between java object and DDB data type is as below:

public class KeyEnumConverter implements AttributeConverter<Item.Key> {
    @Override
    public AttributeValue transformFrom(Item.Key key) {
        return EnhancedAttributeValue.fromString(key.toString()).toAttributeValue();
    }

    @Override
    public Item.Key transformTo(AttributeValue attributeValue) {
        return Item.Key.valueOf(attributeValue.s());
    }

    @Override
    public EnhancedType<Item.Key> type() {
        return EnhancedType.of(Item.Key.class);
    }

    @Override
    public AttributeValueType attributeValueType() {
        return AttributeValueType.S;
    }


public class ValueConverter implements AttributeConverter<Object> {
    @Override
    public AttributeValue transformFrom(Object Value) {
        return getEnhancedAttributeValue(Value).toAttributeValue();
    }

    @Override
    public Object transformTo(AttributeValue attributeValue) {
        return JsonConvertor.getObjectFromJsonString(attributeValue.s(), Object.class);
    }

    @Override
    public EnhancedType<Object> type() {
        return EnhancedType.of(Object.class);
    }

    @Override
    public AttributeValueType attributeValueType() {
        return AttributeValueType.S;
    }

    private EnhancedAttributeValue getEnhancedAttributeValue (Object value) {
        if (Value instanceof Boolean) {
            return EnhancedAttributeValue.fromBoolean((Boolean)Value);
        } else if(value instanceof Number) {
            return EnhancedAttributeValue.fromNumber(String.valueOf(value));
        } else {
            throw new IllegalArgumentException("Please add support for type " + value.getClass().getSimpleName());
        }
    }
}

When I am putting an item into the table:

    public void saveItem (String itemKey) {
        Table.putItem(new Item(Item.Key.valueOf(itemKey)));
    }

I got the error:

One or more parameter values were invalid: Missing the key id in the item

The partitionKey is defined in the model, why the key id still missing

EzyHoo
  • 301
  • 2
  • 14
  • What's your dynamo DB partition key? It looks like you have `id` in DynamoDB, and you don't have that field in `Item` class – Caldazar Dec 28 '21 at 09:01
  • @Caldazar You could see the annotation DynamoDbPartitionKey on the getKey() method. So the partition key is enum Key type. – EzyHoo Dec 28 '21 at 16:53

0 Answers0