springboot api endless l oop когда я назначаю проект сотруднику - PullRequest
0 голосов
/ 22 апреля 2020

Моя проблема заключается в том, что, когда я назначаю проект сотруднику с помощью метода addProject, он создает enless l oop, потому что проект назначен для projectList, в этом списке проектов находится проект, который содержит человек Список с человеком, которому я назначаю проект. Я думаю, что вы получите l oop, как вы можете видеть ниже в ответе json. Кто-нибудь знает, где я запутался? Я думаю, что мне нужно переосмыслить свою концепцию.

Я посмотрел на DTO, но не думаю, что это моя конкретная проблема c.

[
  {
    "id": 1,
    "nachname": "Kämpfer",
    "vorname": "Gerrit",
    "projectList": [
      {
        "id": 1,
        "name": "DFBnet",
        "person": [
          {
            "id": 1,
            "nachname": "Kämpfer",
            "vorname": "Gerrit",
            "projectList": [
              {
                "id": 1,
                "name": "DFBnet",
                "person": [
                  {
                    "id": 1,
                    "nachname": "Kämpfer",
                    "vorname": "Gerrit",
                    "projectList": [
                      {
...

Персона Класс:

package com.example.api.model;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.lang.reflect.Array;
import java.util.*;

@Entity
@Table(name = "person")
public class Person {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotNull
    private String nachname;
    @NotNull
    private String vorname;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "person_project",
            joinColumns = @JoinColumn(name = "person_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "project_id", referencedColumnName = "id"))
    private List<Project> projectList;




    public Person(){}

    public Person(String nachname, String vorname){
        this.nachname = nachname;
        this. vorname = vorname;
    }

    public String getNachname() {
        return nachname;
    }

    public void setNachname(String nachname) {
        this.nachname = nachname;
    }

    public String getVorname() {
        return vorname;
    }

    public void setVorname(String vorname) {
        this.vorname = vorname;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }

    public List<Project> getProjectList() {
        return projectList;
    }

    public void setProjectList(List<Project> projectList) {
        this.projectList = projectList;
    }
}

Класс проекта:

package com.example.api.model;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

@Entity
@Table(name = "project")
public class Project {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotNull
    private String name;

    @ManyToMany(mappedBy = "projectList")
    private List<Person> person;

    public Project(){}

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Person> getPerson() {
        return person;
    }

    public void setPerson(List<Person> person) {
        this.person = person;
    }
}

PersonController:


package com.example.api.controller;

import com.example.api.model.Person;
import com.example.api.model.Project;
import com.example.api.repository.ProjectRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.example.api.repository.PersonRepository;

import java.util.List;
import java.util.Optional;

@RestController
public class PersonController {

    @Autowired
    PersonRepository personRepo;

    @Autowired
    ProjectRepository projectRepo;


    @GetMapping("/person")
    public List<Person> getPerson(){
        return (List<Person>) personRepo.findAll();
    }

    @PostMapping("/person")
    public Person addPerson(@RequestBody Person newPerson){
        return personRepo.save(newPerson);
    }

    @PutMapping("/person/{id}")
    public Person replacePerson(@RequestBody Person newPerson, @PathVariable Long id){
        return personRepo.findById(id)
                .map(person -> {
                    person.setVorname(newPerson.getVorname());
                    person.setNachname(newPerson.getNachname());
                    return personRepo.save(person);

        })
                .orElseGet(() -> {
                   newPerson.setId(id);
                   return personRepo.save(newPerson);
                });
    }

    @GetMapping("/person/{id}")
    public Optional<Person> findPersonById(@PathVariable Long id){
        return personRepo.findById(id);
    }

    @PostMapping("person/{id}/projects")
    public Optional<Person> addProject(@RequestBody List<Project> projectList, @PathVariable Long id){
        return personRepo.findById(id)
                .map(person -> {
                    person.setProjectList(projectList);
                    return personRepo.save(person);
                });
    }





}

Контроллер проекта:

package com.example.api.controller;

import com.example.api.model.Project;
import com.example.api.repository.ProjectRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

@RestController
public class ProjectController {

    @Autowired
    ProjectRepository projectRepo;

    @GetMapping("/project")
    public List<Project> getProjects(){
        return projectRepo.findAll();
    }

    @PostMapping("/project")
    public Project addProject(@RequestBody Project newProject){
        return projectRepo.save(newProject);
    }

    @GetMapping("/project/{id}")
    public Optional<Project> findProjectById(@PathVariable Long id){return projectRepo.findById(id);}
}
PersonRepositrory:

package com.example.api.repository;

import com.example.api.model.Person;
import org.springframework.data.jpa.repository.JpaRepository;


import java.util.Optional;

public interface PersonRepository extends JpaRepository<Person, Long> {

    Optional<Person> findById(Long Id);

}

ProjectRepository:

package com.example.api.repository;


import com.example.api.model.Person;
import com.example.api.model.Project;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;
import java.util.Optional;

public interface ProjectRepository extends JpaRepository<Project, Long> {
}
...