DynamoDBMarshaller到枚举列表的字符串列表

时间:2015-10-23 00:55:27

标签: java enums amazon-dynamodb

我见过this question关于创建一个通用的DynamoDBMarshaller类,它可以用来编组任何Enum类。但是,这对于Enums列表不起作用。

我知道我可以编写一个处理Enums列表的编组器,但我必须将它作为字符串写入dynamo(基本上是jsonify列表)。这不是理想的。对于其他类类型,可以使用@DynamoDBDocument进行注释,但这不适用于枚举类型。

那么,有没有办法将我的Enum类编组为dynamo中的字符串列表?

1 个答案:

答案 0 :(得分:0)

我相信你需要指定你想要序列化的确切枚举类(并且不能做一些通用的)。然后,您可以使用Jackson等库为您进行序列化:

package com.example.shared.models.marshallers;

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMarshaller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.type.CollectionType;

import java.util.List;

public class EnumListMarshaller implements DynamoDBMarshaller<List<ENUM_NAME>> {
    private static final ObjectMapper mapper = new ObjectMapper();
    private static final ObjectWriter writer = mapper.writer();

    @Override
    public String marshall(List<ENUM_NAME> obj) {
        try {
            return writer.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            throw new RuntimeException("Failed to marshall list of enums to dynamo");
        }
    }

    @Override
    public List<ENUM_NAME> unmarshall(Class<List<ENUM_NAME>> clazz, String json) {
        final CollectionType type = mapper.getTypeFactory().constructCollectionType(List.class, ENUM_NAME.class);
        try {
            return mapper.readValue(json, type);
        } catch (Exception e) {
            throw new RuntimeException("Failed to unmarshall list of enums from dynamo");
        }
    }
}

然后在你的DAO中,你会添加注释:

@DynamoDBMarshalling(marshallerClass = EnumListMarshaller.class)

“ENUM_NAME”是您的枚举类。