Building a general DynamoDBMarshalling for enums
amazon-dynamodb, amazon-web-services, annotations, generics, java
Solution
The following worked fine to me:
The Marshaller:
public class EnumMarshaller implements DynamoDBMarshaller<Enum> {
@Override
public String marshall(Enum getterReturnResult) {
return getterReturnResult.name();
}
@Override
public Enum unmarshall(Class<Enum> clazz, String obj) {
return Enum.valueOf(clazz, obj);
}
}
In my table class with an enum:
@DynamoDBMarshalling(marshallerClass=EnumMarshaller.class)
@DynamoDBAttribute(attributeName = "MyEnum")
public MyEnum getMyEnum() {
return myEnum;
}
Problem
I'm using Amazon Web Services SDK for Java for DynamoDB; trying to suffice the interface for @DynamoDBMarshalling: ``` Class<? extends DynamoDBMarshaller<? extends Object>> marshallerClass(); ``` I build a marshaller that receives any Enum: ``` public class EnumMarshaller<T extends Enum<T>> implements DynamoDBMarshaller<T> { @Override public String marshall(T getterReturnResult) { return getterReturnResult.toString(); } @Override public T unmarshall(Class<T> clazz, String obj) { return Enum.valueOf(clazz, obj); } } ``` The problem is that when I'm trying to use the annotation on my field I can't figure it out: ``` public static enum MyEnum {BLA, BLA2} @DynamoDBMarshalling(marshallerClass=EnumMarshaller<MyEnum>.class) public MyEnum getStatus() { return status; } ``` I can't call .class on a generic type and some other tries came up different errors. I'm starting to think it's impossible with Amazon's contract...