4

У меня возникла проблема с сериализацией @RelationshipEntities в JSON через Spring Data Rest. Всякий раз, когда я создаю @RelationshipEntity, я запускаю бесконечную рекурсию при сериализации графика для JSON.Neo4j RelationshipEntities и циклическая проблема сериализации JSON с запасом данных Spring

Использование JSOG для рендеринга графика приводит только к другому, некорректному ответу JSON.

Хотя я могу избежать проблемы с помощью @JsonManagedReference, она не решает проблему, поскольку я хотел бы разоблачить отношения с обоих узлов.

Я создал простое приложение, которое демонстрирует проблему. Его можно найти здесь: https://github.com/cyclomaniac/neo4j-spring-data-rest-cyclic

Он реализует основные базовые команды и игроки NodeEntities с помощью Single RelationshipEntity, PlayerPosition.

игрока:

@NodeEntity 
@JsonIdentityInfo(generator= JSOGGenerator.class) 
public class Player { 

    @GraphId 
    @JsonProperty("id") 
    private Long id; 
    private String name; 
    private String number; 

    @Relationship(type = "PLAYS_ON") 
    private PlayerPosition position; 

    ... 

Команда:

@NodeEntity 
@JsonIdentityInfo(generator= JSOGGenerator.class) 
public class Team { 

    @GraphId 
    @JsonProperty("id") 
    private Long id; 
    private String name; 

    @Relationship(type = "PLAYS_ON", direction = Relationship.INCOMING) 
    Set<PlayerPosition> teamPlayers; 

    ... 

PlayerPosition:

@RelationshipEntity(type="PLAYS_ON") 
@JsonIdentityInfo(generator= JSOGGenerator.class) 
public class PlayerPosition { 
    @GraphId 
    @JsonProperty("id") 
    private Long id; 
    private String position; 

    @StartNode 
    private Player player; 


    @EndNode 
    private Team team; 

    ... 

Когда подключены до GraphRepository, попав/команды оконечных результаты в следующие выходные с JSOG на месте:

{ 
    "_embedded" : { 
    "teams" : [ { 
     "@id" : "1", 
     "name" : "Cubs", 
     "teamPlayers" : [ { 
     "@id" : "2", 
     "position" : "Catcher", 
     "player" : { 
      "@id" : "3" 

Обратите внимание, что JSON заканчивается преждевременно. Сервер генерирует исключение:

2016-11-04 15:48:03.495 WARN 12287 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message: 
org.springframework.http.converter.HttpMessageNotWritableException: 
Could not write content: Can not start an object, 
expecting field name; nested exception is 
com.fasterxml.jackson.core.JsonGenerationException: 
Can not start an object, expecting field name 

Мое предположение, что я выбрал плохой способ реализации отношений, хотя он чувствует себя довольно просто. Я был бы признателен за любые советы о том, как я могу правильно разоблачить эти отношения, в идеале, с помощью Spring Data Rest, как из узлов Team, так и из Player.

ответ

1

Попробуйте аннотировать с помощью @JsonIgnore или пары: @JsonBackReference и @JsonManagedReference