12

Estoy usando Amazon Web Services SDK para Java para DynamoDB; tratando de ser suficiente la interfaz para @DynamoDBMarshalling:Creando un DynamoDBMarshalling general para enums

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

construyo un contador de referencias que recibe cualquier enumeración:

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

El problema es que cuando estoy tratando de utilizar la anotación en mi campo de lo posible 't averiguarlo:

public static enum MyEnum {BLA, BLA2} 

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

no puedo llamar .class en un tipo genérico y algunos otros intentos ocurrió diferentes errores. estoy empezando a pensar que es imposible con un contrato de Amazon ...

Respuesta

16

A continuación se trabajó bien para mí:

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

En mi clase de mesa con una enumeración:

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

, mientras que este enfoque genera algunas advertencias (tanto RawTypes como type safety), funciona. –

+0

Tristemente no puedo probar esta clase como 'marshaller.unmarshall (MyEnum.class, MyEnum.SOMETHING)' no compila esta clase. Clase Obligatoria como primer param. – GuiSim

+1

A partir de la versión 1.10.59, el 'aws-java-sdk' ahora proporciona 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) clase que es una versión más robusta de esta respuesta. – cyfur01

4

que evitaron el problema por sub-clasificar a la JsonMarshaller con un tipo de clase específica:

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

A continuación, se añade la anotación de clasificación de la propiedad de datos como:

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

Un dolor si tiene que agregar muchos tipos de clase, pero funciona.

+0

gracias, me encontré con el mismo problema y esta fue una solución rápida. Además, me gustaría hacer de esto una clase interna "pública estática". por lo tanto, no es necesario ponerlo en un archivo separado. – smartnut007

+3

No veo cómo esto ayuda para cada tipo de enumeración. De la forma en que lo veo, necesitas subclase JsonMarshaller para cada enumeración que crees –