Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何处理AWS DynamoDB中的空java字符串集_Java_Amazon Web Services_Amazon Dynamodb_Aws Lambda - Fatal编程技术网

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

如何处理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

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

我在一个JavaLambda函数中创建了一个DynamoDB模型,该函数的属性之一是一组字符串。如果我试图在字符串集为空时保存DynamoDB模型,则会出现一个错误,说明我无法在DynamoDB中存储空集

所以我的问题是,在我将set属性保存/更新到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);
        }
   }
}
@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)