Search code examples
javaenumssdkamazon-dynamodb

DynamoDB mapping List of Enum


Mapping an enum class in to DynamoDB object is really simple by using Custom Marshall. But how to map a List of Enum?

Enum class

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

Solution

  • I found the answer myself. I create a custom marshall like below.

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