5.8.8. Ограничения для атрибутов-коллекций

Рассмотрим следующую ситуацию:

  • Модель данных содержит сущности Order и OrderLine, образующие one-to-many композицию.

  • Некоторый REST-клиент загружает экземпляр Order вместе с вложенной коллекцией экземпляров OrderLine.

  • Существуют ограничения безопасности, которые отфильтровывают некоторые экземпляры OrderLine так, что клиент не загружает их и не знает об их существовании. Допустим, строка line5 не загружена клиентом, но существует в базе данных.

  • Если клиент удаляет из коллекции некоторую строку, скажем, line2, и сохраняет всю композицию с помощью запроса на /entities/{entityName}/{entityId}, то возможны два исхода:

    1. Если ограничения не были изменены с момента загрузки объектов, фреймворк восстанавливает отфильтрованный элемент коллекции line5 и удаляет только line2, что является корректным поведением.

    2. Если ограничения были изменены таким образом что 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 содержит закодированные идентификаторы отфильтрованных экземпляров, так что фреймворк всегда может восстановить необходимую информацию независимо от изменений в настройках ограничений.