В настоящее время я работаю над проектом 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.
Я был бы очень признателен, если бы кто-то указал мне правильное направление. Извините, если вопрос задан ненадлежащим образом.
Спасибо, что уделили время!