Сопоставление данных Neo4j Spring с Java переполнением стека API - PullRequest
0 голосов
/ 10 марта 2020

У меня ошибка StackOverflowError, когда я пытаюсь отобразить данные из neo4j в данные Spring. Проект использует Lombok.

Я могу получить Проект только с одним Использованием, которое работало нормально. Но для Проекта с двумя или более использованием возникает ошибка.

Кто-нибудь может помочь? Спасибо.

Ошибка:

Resolved exception caused by Handler execution: org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.StackOverflowError

Проект. java

@NodeEntity
@Data
//@JsonIgnoreProperties({"project","use"}) //also tried but same issue
public class Project {
    @Id
    private String id;

    @Nullable
    private String name;

    @JsonIgnoreProperties({"project","use"})
    @Relationship(type = "USED_FOR")
    List<ProjectUseRelation> usedFor = new ArrayList<>();
}

Использование. java

@NodeEntity
@Data
//@JsonIgnoreProperties({"project","use"}) //also tried but same issue
public class Use {
    @Id
    private String id;

    @Nullable
    private String name;

    @JsonIgnoreProperties({"project","use"})
    @Relationship(type = "USED_FOR", direction = Relationship.INCOMING)
    List<ProjectUseRelation> usedByProjects = new ArrayList<>();
}

ProjectUseRelation. java

@RelationshipEntity(type = "USED_FOR")
@Data
public class ProjectUseRelation {
    @Id
    private Long id;

    @Nullable
    private String name;

    @StartNode
    @JsonIgnoreProperties({"usedFor"})
    private Project project;

    @EndNode
    @JsonIgnoreProperties({"usedByProjects"})
    private Use use;
}

Служба. java

@Service
@AllArgsConstructor
public class Service{
private final Repository repository;
@Transactional(readOnly = true)
public Map<String, Object> graph(String id){
    //system correctly reached here
    Collection<Project> result = repository.graph(id);
    //system can't reach here
    return result;
    }
}

Репозиторий. java

public interface Repository extends Neo4jRepository<Project,String>{
    @Query("MATCH map = (p:Project)-[]-(u:Use) WHERE p.id = {id} RETURN map")
    Collection<Project> graph(@Param("id") String id);
}

Теперь это может вернуть меня один / несколько раз в отношения один-один, но не один-один-ко-многим.

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Итак, я понял, что проблема связана с аннотацией Lombok @Data. Если я закомментирую аннотацию @Data и напишу свои собственные методы получения и установки, ошибки переполнения стека не будет.

0 голосов
/ 10 марта 2020

Если вам нужно сериализовать ваши данные в JSON, и ваши сущности имеют круговые зависимости (например, сущность X имеет поле, которое ссылается на Y, а Y имеет поле, которое ссылается на X), тогда вы должны использовать аннотации @JsonIgnoreProperties или @JsonIgnore, где необходимо, чтобы избежать StackOverflowError с во время сериализации.

Подробнее см. В документации .

[ОБНОВЛЕНИЕ]

Ваша сущность Project игнорирует поле ProjectUseRelation.project (во время сериализации), но не игнорирует ProjectUseRelation.use.

А сущность Use игнорирует ProjectUseRelation.use, но не игнорирует ProjectUseRelation.project .

Следовательно, круговая зависимость все еще существует:

   Project.userFor
     -> ProjectUseRelation.use
     -> Use.usedByProjects
     -> ProjectUseRelation.project
     -> Project
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...