Как обрабатывать пустой набор строк java в AWS DynamoDB

Я пытаюсь сохранить массив строк в таблице AWS DynamoDB. По большей части этот массив будет заполнен хотя бы одной строкой. Однако есть случай, когда массив может быть пустым.

Я создал модель DynamoDB в функции Java Lambda, которая имеет набор строк в качестве одного из свойств. Если я попытаюсь сохранить модель 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);
        }
   }
}

Первый раз, когда я создам группу. Он может не иметь пользователя, или может иметь одного или нескольких пользователей.

Ответ 1

Когда дело дошло до фактической проблемы, это произошло потому, что у меня был унаследован код, который был у SaveBehavior на DynamoDBMapperConfig установлен на UPDATE_SKIP_NULL_ATTRIBUTES, который пропускает нулевые значения и поэтому никогда не удалит их из DynamoDB. См. Этот пост объяснений всех разных типов поведения. https://java.awsblog.com/post/Tx1MH3BFPW8FX6W/Using-the-SaveBehavior-Configuration-for-the-DynamoDBMapper

Чтобы подробнее остановиться на этом,

Я устанавливаю свой DynamoDBMapperConfig.SaveBehavior как таковой в моем проекте JAVA.

_dynamoDBMapperConfig = new DynamoDBMapperConfig.Builder() .withSaveBehavior(SaveBehavior.UPDATE) .withTableNameResolver(TABLE_NAME_RESOLVER) .withConversionSchema(ConversionSchemas.V2) .build();

Затем всякий раз, когда вы обновляете модель с сопоставленным атрибутом @DynamoDBA, вам также нужно установить конкретное значение (null).

user.setFirstName(null)

Это был самый простой способ, с помощью которого я смог удалить атрибуты из записи DynamoDB.

Ответ 2

Это несколько старый вопрос, но я решил бы эту проблему с помощью DynamoDBMarshaller.

Используя аннотацию @DynamoDBMarshalling, вы можете украсить методы доступа POJO, чтобы диктовать сопоставителю DynamoDB, который класс маршаллеров используется для сериализации и десериализации набора строк. Таким образом, вы получаете контроль над специальными вариантами использования.

Здесь также ссылка на сообщение в блоге AWS с примером

Одна оговорка с вышеприведенным подходом заключается в том, что решение marshaller клиента сериализуется и десериализуется в/из строки, поэтому представление в базе данных не будет само по себе. Тем не менее, я бы не стал считать это слишком плохим.

Другим подходом может быть использование Document API вместо объектов-сопоставлений, который дает вам полный контроль над элементами. Хотя я все равно поеду для пользовательского картографа со строкой.