为枚举构建一个通用的DynamoDBMarshalling

Che*_*rel 12 java generics annotations amazon-web-services amazon-dynamodb

我正在使用Amazon Web Services SDK for Java for DynamoDB; 试图满足@DynamoDBMarshalling的界面:

Class<? extends DynamoDBMarshaller<? extends Object>> marshallerClass();
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我试图在我的字段上使用注释时,我无法弄清楚:

public static enum MyEnum {BLA, BLA2}

@DynamoDBMarshalling(marshallerClass=EnumMarshaller<MyEnum>.class)
    public MyEnum getStatus()
    {
        return status;
    }
Run Code Online (Sandbox Code Playgroud)

我无法在泛型类型上调用.class,而其他一些尝试则出现了不同的错误.亚马逊的合同我开始认为这是不可能的......

Tia*_*nça 16

以下对我来说很好:

马歇尔:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的带有枚举的表类中:

@DynamoDBMarshalling(marshallerClass=EnumMarshaller.class)
@DynamoDBAttribute(attributeName = "MyEnum")
public MyEnum getMyEnum() {
   return myEnum;
}
Run Code Online (Sandbox Code Playgroud)

  • 从 1.10.59 版本开始,`aws-java-sdk` 现在提供 [`AbstractEnumMarshaller`](https://github.com/aws/aws-sdk-java/blob/199​​fba92dd0cdf4133f4aa5b08cfc10a11c27b31c27b31 dynamodb/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/AbstractEnumMarshaller.java) 类,这是此答案的更强大版本。 (2认同)