Подтвердить что ты не робот

Создание общего 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...

4b9b3361

Ответ 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;
}

Боль, если вам нужно добавить много типов классов, но она работает.