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

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

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

因此,我的问题是,在 DynamoDB 中保存/更新该设置属性之前,如何处理从我的模型中移除该集合属性(如果该属性为空)?

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

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

第一次,当我将创建一个组。它可以没有用户,也可以有一个或多个用户。


答案 1

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

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

下面还有一个指向 AWS 博客文章的链接,其中包含一个示例

上述方法需要注意的是,客户 marshaller 解决方案序列化并反序列化到/从字符串,因此数据库中的表示形式本身不会是一个集合。但是,我不认为这太糟糕了。

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


答案 2

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


推荐