3.9.8. Ограничения для атрибутов-коллекций
Рассмотрим следующую ситуацию:
-
Модель данных содержит сущности
Order
иOrderLine
, образующие one-to-many композицию. -
Некоторый REST-клиент загружает экземпляр
Order
вместе с вложенной коллекцией экземпляровOrderLine
. -
Существуют ограничения безопасности, которые отфильтровывают некоторые экземпляры
OrderLine
так, что клиент не загружает их и не знает об их существовании. Допустим, строкаline5
не загружена клиентом, но существует в базе данных. -
Если клиент удаляет из коллекции некоторую строку, скажем,
line2
, и сохраняет всю композицию с помощью запроса на/entities/{entityName}/{entityId}
, то возможны два исхода:-
Если ограничения не были изменены с момента загрузки объектов, фреймворк восстанавливает отфильтрованный элемент коллекции
line5
и удаляет толькоline2
, что является корректным поведением. -
Если ограничения были изменены таким образом что
line5
стал доступным клиенту, фреймворк не может корректно восстановить информацию об отфильтрованных элементах коллекции. В результате будут удалены оба элемента:line2
иline5
.
-
Если в вашем приложении подобная ситуация возможна, то избежать потери данных можно путем пересылки в JSON специального системного атрибута. Данный атрибут имеет имя __securityToken
и автоматически включается в результирующий JSON если свойство приложения cuba.rest.requiresSecurityToken установлено в true. В этом случае в обязанности вашего REST-клиента входит передача этого атрибута обратно при сохранении сущности.
Пример JSON сущности с включенным security token:
{
"id": "fa430b56-ceb2-150f-6a85-12c691908bd1",
"number": "OR-000001",
"items": [
{
"id": "82e6e6d2-be97-c81c-c58d-5e2760ae095a",
"description": "Item 1"
},
{
"id": "988a8cb5-d61a-e493-c401-f717dd9a2d66",
"description": "Item 2"
}
],
"__securityToken": "0NXc6bQh+vZuXE4Fsk4mJX4QnhS3lOBfxzUniltchpxPfi1rZ5htEmekfV60sbEuWUykbDoY+rCxdhzORaYQNQ=="
}
Атрибут __securityToken
содержит закодированные идентификаторы отфильтрованных экземпляров, так что фреймворк всегда может восстановить необходимую информацию независимо от изменений в настройках ограничений.