12

我正在为DynamoDB使用适用于Java的Amazon Web Services SDK;想足够了@DynamoDBMarshalling接口:为枚举建立一个通用的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); 
    } 
} 

的问题是,当我试图使用注释上我的领域我可以“T看着办吧:

public static enum MyEnum {BLA, BLA2} 

@DynamoDBMarshalling(marshallerClass=EnumMarshaller<MyEnum>.class) 
    public MyEnum getStatus() 
    { 
     return status; 
    } 

我不能叫的.class一个泛型类型和一些其他的尝试想出了不同的错误。 我开始认为这是不可能与亚马逊的合同......

回答

16

以下的罚款对我说:

则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); 
    } 
} 

在具有枚举我的表类:

@DynamoDBMarshalling(marshallerClass=EnumMarshaller.class) 
@DynamoDBAttribute(attributeName = "MyEnum") 
public MyEnum getMyEnum() { 
    return myEnum; 
} 
+0

,而这种方法引发一些警告(rawTypes和类型安全),它确实有效。 – 2013-12-08 10:50:35

+0

可悲的是我无法单元测试这个类,因为'marshaller.unmarshall(MyEnum.class,MyEnum.SOMETHING)'不能编译。作为第一参数需要的类别。 – GuiSim 2016-01-18 22:22:56

+1

从版本1.10.59开始,'aws-java-sdk'现在提供['AbstractEnumMarshaller'](https://github.com/aws/aws-sdk-java/blob/199​​fba92dd0cdf4133f4aa5b08cfc10a11c27b31/aws-java-sdk -dynamodb/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/AbstractEnumMarshaller.java)类,这是此答案的更健壮版本。 – cyfur01 2016-07-06 19:32:49

4

我工作围绕这一问题,通过子类的JsonMarshaller与特定的类类型:

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

然后编组注释附加到数据属性如下:

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

如果您必须添加许多类类型,但它的工作原理会很痛苦。

+0

感谢,我遇到同样的问题,这是一个快速解决。附加地,我只是让这个内部的“公共静态”类。所以,它不需要放在一个单独的文件中。 – smartnut007 2012-05-22 03:17:12

+3

我不明白这对每种枚举类型都有帮助。我看到它的方式,你需要为每个你创建的枚举子类JsonMarshaller – 2012-07-01 10:18:00