如何处理AWS DynamoDB中的空java字符串集
我试图在AWS DynamoDB表中存储字符串数组。在大多数情况下,此数组将至少填充一个字符串。但是,在这种情况下,数组可能为空 我在一个JavaLambda函数中创建了一个DynamoDB模型,该函数的属性之一是一组字符串。如果我试图在字符串集为空时保存DynamoDB模型,则会出现一个错误,说明我无法在DynamoDB中存储空集 所以我的问题是,在我将set属性保存/更新到DynamoDB之前,当它为空时,如何处理从我的模型中删除它 下面是该模型的一个示例如何处理AWS DynamoDB中的空java字符串集,java,amazon-web-services,amazon-dynamodb,aws-lambda,Java,Amazon Web Services,Amazon Dynamodb,Aws Lambda,我试图在AWS DynamoDB表中存储字符串数组。在大多数情况下,此数组将至少填充一个字符串。但是,在这种情况下,数组可能为空 我在一个JavaLambda函数中创建了一个DynamoDB模型,该函数的属性之一是一组字符串。如果我试图在字符串集为空时保存DynamoDB模型,则会出现一个错误,说明我无法在DynamoDB中存储空集 所以我的问题是,在我将set属性保存/更新到DynamoDB之前,当它为空时,如何处理从我的模型中删除它 下面是该模型的一个示例 @DynamoDBTable(ta
@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);
}
}
}
@DynamoDBTable(tableName=“group”)
公共课组{
私有字符串_id;
私人用户;
@空的
@发电机钥匙
@发电键
公共字符串getId(){
返回_id;
}
公共无效集合id(最终字符串id){
_id=id;
}
@发电机属性
公共集getUsers(){
返回用户;
}
公共无效集合用户(最终集合用户){
this.users=用户;
}
public void addUser(字符串userId){
if(this.users==null){
this.setUsers(新的HashSet(Arrays.asList(userId));
}否则{
this.getUsers().add(userId);
}
}
}
第一次我将创建一个组。它可能没有用户,也可能有一个或多个用户。这是一个老问题,但我解决这个问题的方法是使用自定义 利用
@DynamoDBMarshalling
注释,您可以修饰POJO访问器方法,以便向DynamoDB映射器指定要使用哪个封送器类来序列化和反序列化字符串集。通过这种方式,您可以控制特殊用例
这里还有一个
上述方法的一个警告是,customer marshaller解决方案对字符串进行序列化和反序列化,以便数据库中的表示本身不会是一个集合。不过,我不会认为这太糟糕了。
另一种方法可能是使用,而不是对象映射器,这使您能够完全控制项目。尽管我仍然会选择带有字符串支持的自定义映射器。当谈到实际问题时,这是因为我继承的代码在DynamoDBMapperConfig上设置了SaveBehavior以更新跳过空值的属性,因此永远不会从DynamoDB中删除它们。请参阅这篇解释所有不同保存行为的文章 我想进一步阐述一下 我正在JAVA项目中设置DynamoDBMapperConfig.SaveBehavior
\u dynamoDBMapperConfig=新建dynamoDBMapperConfig.Builder()
.withSaveBehavior(SaveBehavior.UPDATE)
.withTableNameResolver(表\u名称\u RESOLVER)
.withConversionSchema(ConversionSchemas.V2)
.build()代码>
然后,无论何时更新具有映射的@DynamoDBAttribute的模型,都需要将特定值设置为(null)
这是我发现的能够从DynamoDB条目中删除属性的最简单的方法 根据我与AWS技术支持部门就此进行的进一步对话,听起来公认的做法是删除现有项,并使用相同的主索引重新创建一个新项,而不使用将为null的属性。我试过了,但运气不好。这意味着我们不能在这种情况下使用任何Java POJO类?谢谢!我将尽力实施这一点。
user.setFirstName(null)