API REST Java Spring Boot - неразрешенные прямые ссылки для отношения один ко многим - PullRequest
0 голосов
/ 26 января 2019

В настоящее время я работаю над проектом REST API в Spring Boot. Я создал две сущности - Игрока и Команду, и они связаны отношениями «один ко многим».

По сути, проблема в том, что я пытаюсь создать нового игрока, затем новую команду и назначить ему игрока. Я делаю следующее:

POST /players/

{
   "name": "Michael Jordan"
}

POST /teams/

{
  "name": "Chicago Bulls",
  "players": [1]
}

И тогда я получаю следующий ответ:

{
    "timestamp": "2019-01-26T17:18:11.383+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "JSON parse error: Unresolved forward references for: ; nested exception is com.fasterxml.jackson.databind.deser.UnresolvedForwardReference: Unresolved forward references for: \n at [Source: (PushbackInputStream); line: 1, column: 43]Object id [1] (for `com.proglabs.nbaprojectrestapi.models.Player`) at [Source: (PushbackInputStream); line: 1, column: 41].",
    "path": "/teams/"
}

Код для моделей:

AbstractModel.java

import javax.persistence.*;

@MappedSuperclass
public abstract class AbstractModel {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    protected int id;

    @Column
    protected String name;

    // setters, getters...
}

Player.java

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import org.joda.time.LocalDate;

import javax.persistence.*;

@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id",
        scope = Player.class)
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Entity
public class Player extends AbstractModel {

    @Column
    private LocalDate birthday;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Team team;

    // ...
}

Team.java

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id",
        scope = Team.class)
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Entity
public class Team extends AbstractModel {

    @Column
    private int championships;

    @OneToMany(mappedBy = "team", fetch = FetchType.LAZY)
    private Set<Player> players = new HashSet<Player>();

    // setters, getters, other columns ...
}

Код для контроллеров:

AbstractController.java

import com.proglabs.nbaprojectrestapi.models.AbstractModel;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.web.bind.annotation.*;

import java.util.List;

public abstract class AbstractController<T extends AbstractModel> {

    protected JpaRepository<T, Integer> repository;

    // ...

    @PostMapping("")
    public T create(@RequestBody T newEntity) {
        return repository.save(newEntity);
    }

    // ...
}

TeamController / PlayerController (соответствующие части идентичны)

import com.proglabs.nbaprojectrestapi.models.Team;
import com.proglabs.nbaprojectrestapi.repositories.TeamRepository;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/teams")
public class TeamController extends AbstractController<Team> {

    public TeamController(TeamRepository repository) {
        this.repository = repository;
    }

    // ...

}

Я думаю, что проблема может заключаться в моем понимании того, как должен создаваться API, но мой подход работал нормально, когда я использовал Джексона (без Spring) для простой сериализации / десериализации объектов в / из файлов json.

Я был бы очень признателен, если бы кто-то указал мне правильное направление. Извините, если вопрос задан ненадлежащим образом.

Спасибо, что уделили время!

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Попробуйте добавить id-конструктор в Player:

public Player(int id) {
  this.id=id;
}
0 голосов
/ 26 января 2019

Я думаю, что ваш JSON должен смоделировать вашу сущность ближе. Вы пытались опубликовать JSON, который выглядит так

POST / команды /

{
    "name": "Chicago Bulls",
    "players": [
       {  "name": "Michael Jordan" },
       {  "name": "Joe Blogs" }  
    ]
}

Я бы также воздерживался от использования абстрактных классов, пока вы не заработаете. Классы гнездования могут потребовать дополнительных умственных усилий для поддержания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...