如何处理 AWS DynamoDB 中的一组空 java 字符串
How do I handle an empty java set of strings in AWS DynamoDB
我正在尝试在 AWS DynamoDB table 中存储一个字符串数组。在大多数情况下,该数组将至少填充一个字符串。但是,存在数组可能为空的情况。
我在 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);
}
}
}
第一次建群。它可以没有用户,也可以有一个或多个用户。
这是一个有点老的问题,但我解决这个问题的方法是使用自定义 DynamoDBMarshaller。
利用 @DynamoDBMarshalling
注释,您可以修饰 POJO 访问器方法,以便指示 DynamoDB 映射器使用哪个编组器 class 来序列化和反序列化字符串集。这样您就可以控制特殊用例。
这里还有一个link to an AWS blog post with an example
上述方法的一个警告是客户编组器解决方案序列化和反序列化 to/from 字符串,因此数据库中的表示本身不是集合。不过,我不认为那太糟糕了。
另一种方法可能是使用 Document API,而不是对象映射器,这样您就可以完全控制项目。虽然我仍然会选择带有字符串支持的自定义映射器。
归结为实际问题是因为我继承的代码将 DynamoDBMapperConfig 上的 SaveBehavior 设置为 UPDATE_SKIP_NULL_ATTRIBUTES,它会跳过空值,因此永远不会将它们从 DynamoDB 中删除。请参阅此 post 对所有不同保存行为的解释。 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 条目中删除属性的最简单方法。
我正在尝试在 AWS DynamoDB table 中存储一个字符串数组。在大多数情况下,该数组将至少填充一个字符串。但是,存在数组可能为空的情况。
我在 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);
}
}
}
第一次建群。它可以没有用户,也可以有一个或多个用户。
这是一个有点老的问题,但我解决这个问题的方法是使用自定义 DynamoDBMarshaller。
利用 @DynamoDBMarshalling
注释,您可以修饰 POJO 访问器方法,以便指示 DynamoDB 映射器使用哪个编组器 class 来序列化和反序列化字符串集。这样您就可以控制特殊用例。
这里还有一个link to an AWS blog post with an example
上述方法的一个警告是客户编组器解决方案序列化和反序列化 to/from 字符串,因此数据库中的表示本身不是集合。不过,我不认为那太糟糕了。
另一种方法可能是使用 Document API,而不是对象映射器,这样您就可以完全控制项目。虽然我仍然会选择带有字符串支持的自定义映射器。
归结为实际问题是因为我继承的代码将 DynamoDBMapperConfig 上的 SaveBehavior 设置为 UPDATE_SKIP_NULL_ATTRIBUTES,它会跳过空值,因此永远不会将它们从 DynamoDB 中删除。请参阅此 post 对所有不同保存行为的解释。 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 条目中删除属性的最简单方法。