12

我正在为 DynamoDB 使用适用于 Java 的 Amazon Web Services SDK;试图满足@DynamoDBMarshalling 的接口:

Class<? extends DynamoDBMarshaller<? extends Object>> marshallerClass();

我构建了一个接收任何枚举的编组器:

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 并且其他一些尝试出现了不同的错误。我开始认为亚马逊的合同是不可能的......

4

2 回答 2

17

以下对我来说很好:

马歇尔:

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;
}
于 2013-12-06T16:45:25.640 回答
4

我通过使用特定的类类型对 JsonMarshaller 进行子类化来解决这个问题:

public class FooMarshaller extends JsonMarshaller<Foo>
{
    // No impl required
}

然后将编组注释添加到数据属性中,例如:

@DynamoDBMarshalling(marshallerClass = FooMarshaller.class)
public Set<Foo> getFoos()
{
    return foos;
}

如果您必须添加许多类类型会很痛苦,但它确实有效。

于 2012-05-01T23:58:58.297 回答