如何在AWS DynamoDB中处理空的java字符串集

时间:2016-04-28 14:21:57

标签: java amazon-web-services amazon-dynamodb aws-lambda

我正在尝试在AWS DynamoDB表中存储字符串数组。在大多数情况下,此数组将填充至少一个字符串。但是,存在阵列可能为空的情况。

我在Java Lambda函数中创建了一个DynamoDB模型,该函数有一组字符串作为其中一个属性。如果我在字符串集为空时尝试保存DynamoDB模型,则会给出一个错误,指出我无法在DynamoDB中存储空集。

所以我的问题是,在我在DynamoDB中保存/更新它之前,如何从我的模型中删除该set属性?

以下是该模型的一个示例。

@DynamoDBTable(tableName = "group")
public class Group {
    private String _id;
    private Set<String> users;

    @Null
    @DynamoDBHashKey
    @DynamoDBAutoGeneratedKey
    public String getId() {
        return _id;
    }

    public void setId(final String id) {
        _id = id;
    }

    @DynamoDBAttribute
    public Set<String> getUsers(){
        return users;
    }

    public void setUsers(final Set<String> users) {
        this.users = users;
    }

    public void addUser(String userId) {
        if(this.users == null){
            this.setUsers(new HashSet<String>(Arrays.asList(userId)));
        }else{
            this.getUsers().add(userId);
        }
   }
}

我第一次创建一个小组。它可能没有用户,也可能有一个或多个用户。

2 个答案:

答案 0 :(得分:1)

这有点老问题,但我解决这个问题的方法是使用自定义DynamoDBMarshaller

利用@DynamoDBMarshalling注释,您可以修饰POJO访问器方法,以指示DynamoDB映射器使用哪个编组器类来序列化和反序列化字符串集。这样您就可以控制特殊用例。

这也是link to an AWS blog post with an example

使用上述方法的一个警告是客户编组解决方案对字符串进行序列化和反序列化,因此数据库中的表示本身不是集合​​。但是,我不认为这太糟糕了。

另一种方法可能是使用Document API而不是对象映射器,它可以让您完全控制项目。虽然我仍然会选择带有字符串支持的自定义映射器。

答案 1 :(得分:0)

当遇到实际问题时,因为我继承的代码将DynamoDBMapperConfig上的SaveBehavior设置为UPDATE_SKIP_NULL_ATTRIBUTES,它跳过空值,因此永远不会从DynamoDB中删除它们。请参阅此帖对所有不同保存行为的解释。 https://java.awsblog.com/post/Tx1MH3BFPW8FX6W/Using-the-SaveBehavior-Configuration-for-the-DynamoDBMapper

进一步阐述这一点。

我在我的JAVA项目中设置了DynamoDBMapperConfig.SaveBehavior。

_dynamoDBMapperConfig = new DynamoDBMapperConfig.Builder() .withSaveBehavior(SaveBehavior.UPDATE) .withTableNameResolver(TABLE_NAME_RESOLVER) .withConversionSchema(ConversionSchemas.V2) .build();

然后,每当您更新具有映射的@DynamoDBAttribute的模型时,您还需要将特定值设置为(null)。

user.setFirstName(null)

这是我发现能够从DynamoDB条目中删除属性的最简单方法。