Обработка циклических ссылок с использованием JSOGGenerator вызывает «неразрешенные прямые ссылки» в бэкэнде - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть Java + бэкэнд Spring, использующий DTO и Mapstruct для сопоставления с сущностями. Существует интерфейс React + Typescript.

У меня возникли проблемы с треками mov ie и их отношениями друг с другом (подумайте "Bandersnatch").

У меня есть несколько SceneDTO, которые содержат ссылки на потенциальные последующие сцены, чтобы иметь возможность показать их пользователю в зависимости от того, какой выбор они сделают.

Пока у меня нет циклов в цепочке сцен, проблем не возникает. Но я пытаюсь создать сюжетную линию, в которой сцена может вернуться к предыдущей сцене, потенциально вызывая цикл / цикл. Это задумано и должно быть возможно, но я не могу заставить его работать.

Для достижения sh этого я использую CycleAvoidingMappingContext из { ссылка }, чтобы избежать циклов отображения, когда преобразование в / из DTO. Это хорошо работает.

Затем я пытаюсь использовать JSOG в качестве плагина Джексона в моем бэкэнде для обработки JSON сериализации / десериализации:

import com.voodoodyne.jackson.jsog.JSOGGenerator;

@JsonIdentityInfo(generator=JSOGGenerator.class)
public class SceneDTO implements Serializable {

  private Long id;

  private String name;

  private Set<SceneDTO> nextScenes;

}

Это приводит к тому, что объект выглядит так в моем фронте -конец (обратите внимание на @ref: 2, который решает бесконечное l oop):

{
"@id": "1",
"id": 1,
"name": "Ouvertyre",
"nextScenes": [
  {
    "@id": "2",
    "id": 2,
    "name": "Enter Romeo",
    "nextScenes": [
      {
        "@id": "3",
        "id": 3,
        "name": "Romeo finds a note",
        "nextScenes": [
          {
            "@ref": "2"
          },
          {
            "@id": "4",
            "id": 4,
            "name": "Enter Juliet",
            "nextScenes": [
              {
                "@id": "5",
                "id": 5,
                "name": "Juliet dies",
                "nextScenes": [
                  {
                    "@id": "6",
                    "id": 6,
                    "name": "Romeo cries (end)",
                    "nextScenes": []
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]  

}

Пока все хорошо. Но когда я пытаюсь отправить этот объект в свой бэкэнд, я получаю эту ошибку:

Bad Request: JSON parse error: Unresolved forward references for: ; nested exception is com.fasterxml.jackson.databind.deser.UnresolvedForwardReference: Unresolved forward references for: 
 at [Source: (PushbackInputStream); line: 1, column: 2382]Object id [com.voodoodyne.jackson.jsog.JSOGRef@31] (for `org.mycompany.project.service.dto.SceneDTO`) at [Source: (PushbackInputStream); line: 1, column: 806].

Затем я попытался использовать этот пакет машинописи JSOG https://github.com/emundo/jsog-typescript для воссоздания полного json перед отправкой в ​​бэкэнд. Но тогда я получаю эту проблему в браузере вместо этого из-за бесконечного l oop:

Uncaught (in promise) TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'Object'
    |     property 'nextScenes' -> object with constructor 'Array'
    |     index 0 -> object with constructor 'Object'
    |     property 'nextScenes' -> object with constructor 'Array'
    --- index 0 closes the circle
    at Object.stringify (<anonymous>)
    at transformRequest (defaults.js:53)
    at transform (transformData.js:16)
    at Object.forEach (utils.js:222)
    at transformData (transformData.js:15)
    at dispatchRequest (dispatchRequest.js:37)

Так что я не думаю, что это путь к go.

Есть ли что-то не хватает в моей настройке, чтобы сделать эту работу? Я неправильно использую решение JSOG?

Буду рад любому совету!

PS. Мой текущий обходной путь - никогда не отправлять объект jsog с циклами в бэкэнд, вместо этого отправляя идентификаторы для разных целей на разных специально созданных конечных точках. Не очень масштабируемое решение.

...