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