Создание общего DynamoDBMarshalling для перечислений
Я использую SDK для Amazon Web Services для Java для DynamoDB; пытаясь удержать интерфейс для @DynamoDBMarshalling:
Class<? extends DynamoDBMarshaller<? extends Object>> marshallerClass();
Я создаю маршаллер, который получает любой 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);
}
}
Проблема в том, что когда я пытаюсь использовать аннотацию в своем поле, я не могу понять:
public static enum MyEnum {BLA, BLA2}
@DynamoDBMarshalling(marshallerClass=EnumMarshaller<MyEnum>.class)
public MyEnum getStatus()
{
return status;
}
Я не могу вызвать класс .class для общего типа, а некоторые другие попытки принесли разные ошибки.
Я начинаю думать, что это невозможно с контрактом Amazon...
Ответы
Ответ 1
Следующее работало отлично для меня:
Маршаллер:
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);
}
}
В моем классе таблицы с перечислением:
@DynamoDBMarshalling(marshallerClass=EnumMarshaller.class)
@DynamoDBAttribute(attributeName = "MyEnum")
public MyEnum getMyEnum() {
return myEnum;
}
Ответ 2
Я работал над этой проблемой, подклассифицируя JsonMarshaller с определенным типом класса:
public class FooMarshaller extends JsonMarshaller<Foo>
{
// No impl required
}
Затем маршаллинговая аннотация добавляется к свойству данных, например:
@DynamoDBMarshalling(marshallerClass = FooMarshaller.class)
public Set<Foo> getFoos()
{
return foos;
}
Боль, если вам нужно добавить много типов классов, но она работает.