Как обрабатывать пустой набор строк 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 вместо объектов-сопоставлений, который дает вам полный контроль над элементами. Хотя я все равно поеду для пользовательского картографа со строкой.