12

Sto utilizzando Amazon Web Services SDK per Java per DynamoDB; cercando di bastare l'interfaccia per @DynamoDBMarshalling:Creazione di un DynamoDBMarshalling generale per le enumerazioni

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

Costruisco una marshaller che riceve ogni 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); 
    } 
} 

Il problema è che quando sto cercando di usare l'annotazione sul mio campo che posso 't capirlo:

public static enum MyEnum {BLA, BLA2} 

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

non posso chiamare .class su un tipo generico e alcuni altri tentativi si avvicinò diversi errori. Sto iniziando a pensare che sia impossibile con contratto di Amazon ...

risposta

16

Quanto segue ha funzionato bene per me:

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

Nella mia classe tabella con un enum:

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

mentre questo approccio solleva alcuni avvertimenti (sia rawTypes che type safety), funziona. –

+0

Purtroppo non riesco a testare questa classe come "marshaller.unmarshall (MyEnum.class, MyEnum.SOMETHING)" non viene compilato. Classe richiesta come 1 ° parametro. – GuiSim

+1

A partire dalla versione 1.10.59, 'aws-java-sdk' ora fornisce un [' AbstractEnumMarshaller'] (https://github.com/aws/aws-sdk-java/blob/199fba92dd0cdf4133f4aa5b08cfc10a11c27b31/aws-java-sdk -dynamodb/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/AbstractEnumMarshaller.java) classe che è una versione più robusta di questa risposta. – cyfur01

4

ho lavorato intorno a questo problema sub-classificare l'JsonMarshaller con uno specifico tipo di classe:

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

Poi l'annotazione di smistamento viene aggiunto proprietà dei dati come:

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

Un dolore se devi aggiungere molti tipi di classe, ma funziona.

+0

grazie, ho incontrato lo stesso problema e questa era una soluzione rapida. Addionalmente vorrei solo rendere questa una classe interna "statica pubblica". quindi, che non deve essere messo in un file separato. – smartnut007

+3

Non vedo come questo aiuti per ogni tipo di enum. Per come la vedo io ho bisogno di sottoclasse JsonMarshaller per ogni enum che crei –