2016-04-08 6 views
3

Mapping einer Enum-Klasse in DynamoDB-Objekt ist wirklich einfach mit Custom Marshall. Aber wie man eine Liste von Enum abbildet?DynamoDB Mapping Liste der Enum

Enum Klasse

public enum Transport { 
SMS,EMAIL,ALL; 
} 

DynamoDB Mapper

public class Campaign{ 
    private List<Transport> transport; 

    @DynamoDBAttribute(attributeName = "transport") 
    public List<Transport> getTransport() { 
     return transport; 
    } 

    public void setTransport(List<Transport> transport) { 
     this.transport = transport; 
    } 
} 

Antwort

0

fand ich die Antwort selbst. Ich erstelle einen benutzerdefinierten Marshall wie unten.

public class TransportMarshaller implements DynamoDBMarshaller<List<Transport>> { 

@Override 
public String marshall(List<Transport> transports) { 
    List<String>transportMap=new ArrayList<>(); 
    for(Transport transport:transports){ 
     transportMap.add(transport.name()); 
    } 
    return transportMap.toString().replaceAll("\\[|\\]", "");//Save as comma separate value for the purpose of easiness to unmarshall 
} 

@Override 
public List<Transport> unmarshall(Class<List<Transport>> aClass, String s) { 
    List<String>map= Arrays.asList(s.split("\\s*,\\s*")); //split from comma and parse to List 
    List<Transport>transports=new ArrayList<>(); 
    for (String st:map){ 
     transports.add(Transport.valueOf(st)); 
    } 
    return transports; 
} 
} 
3

DynamoDBMarshaller ist veraltet. Verwenden Sie stattdessen DynamoDBTypeConverter.

Beispiel:

Enum Klasse

public static enum ValidationFailure { 
    FRAUD, GENERAL_ERROR 
} 

DynamoDBTable Klasse

@DynamoDBTable(tableName = "receipt") 
public class Receipt { 

    private Long id; 
    private List<ValidationFailure> validation; 

    @DynamoDBHashKey(attributeName = "id") 
    public Long getId() { 
     return id; 
    } 

    @DynamoDBTypeConverted(converter = ValidationConverter.class) 
    public List<ValidationFailure> getValidation() { 
     return validation; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public void setValidation(List<ValidationFailure> validation) { 
     this.validation = validation; 
    } 
} 

Convertor:

public class ValidationConverter implements DynamoDBTypeConverter<List<String>, List<ValidationFailure>> { 

@Override 
public List<String> convert(List<ValidationFailure> object) { 
    List<String> result = new ArrayList<String>(); 
    if (object != null) { 
     object.stream().forEach(e -> result.add(e.name())); 
    } 
    return result; 
} 

@Override 
public List<ValidationFailure> unconvert(List<String> object) { 
    List<ValidationFailure> result = new ArrayList<ValidationFailure>(); 
    if (object != null) { 
     object.stream().forEach(e -> result.add(ValidationFailure.valueOf(e))); 
    } 
    return result; 
} 
}