12

Ich verwende Amazon Web Services SDK für Java für DynamoDB; versucht, die Schnittstelle für @DynamoDBMarshalling zu genügen:Erstellen eines allgemeinen DynamoDBMarshalling für Enums

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

ich einen Einweiser bauen, die jede Enum erhält:

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

Das Problem ist, dass, wenn ich versuche, die Anmerkung auf meinem Feld zu verwenden, kann ich ‚t es herauszufinden:

public static enum MyEnum {BLA, BLA2} 

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

ich nicht .class- auf einem generischen Typ nennen kann und einige andere Versuche kamen verschiedene Fehler auf. Ich beginne mit Amazon Vertrag, es ist unmöglich zu denken ...

Antwort

16

Die folgende arbeitete gut zu mir:

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

In meinem Tisch Klasse mit einem Enum:

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

erstellen, während dieser Ansatz einige Warnungen (sowohl RawTypes und Typ Sicherheit), es funktioniert. –

+0

Leider kann ich diese Klasse als 'marshaller.unmarshall (MyEnum.class, MyEnum.SOMETHING)' nicht kompilieren. Erforderliche Klasse als 1. Param. – GuiSim

+1

Ab Version 1.10.59 bietet die 'aws-java-sdk' nun einen [' AbstractEnumMarshaller'] (https://github.com/aws/aws-sdk-java/blob/199fba92dd0cdf4133f4aa5b08cfc10a11c27b31/aws-java-sdk -dynamodb/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/AbstractEnumMarshaller.java) Klasse, die eine robustere Version dieser Antwort ist. – cyfur01

4

ich um dieses Problem gearbeitet, indem die JsonMarshaller mit einem bestimmten Klassentyp Nebenklassen:

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

Dann wird die Rangierung Anmerkung hinzugefügt die Dateneigenschaft wie:

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

Ein Schmerz, wenn Sie viele Klassentypen hinzufügen müssen, aber es funktioniert.

+0

Dank, ich lief in die gleichen Problem und das war eine schnelle Lösung. Zusätzlich würde ich dies zu einer inneren "öffentlichen statischen" Klasse machen. so dass es nicht in einer separaten Datei gespeichert werden muss. – smartnut007

+3

Ich sehe nicht, wie dies für jeden Enum-Typ hilft. Die Art, wie ich es sehe, müssen Sie JsonMarshaller Sub-Klasse für jede Enum –