繁体   English   中英

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

[英]How do I handle an empty java set of strings in AWS DynamoDB

我正在尝试在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);
        }
   }
}

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

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

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

这里还有一个带有示例的AWS博客文章链接

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

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

当它归结为实际问题时,因为我继承的代码将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条目中删除属性的最简单方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM