Управление циклической зависимостью в ответе JSON - PullRequest
0 голосов
/ 20 марта 2020

Как мне справиться с зависимостью между двумя сущностями? Я хочу иметь возможность получать игры для игрока, а также игроков для игры. В настоящее время я пытаюсь сделать это с @JsonIdentityInfo, но результат не удовлетворяет.

    @Entity
    @Table(name = "player", uniqueConstraints = { @UniqueConstraint(columnNames = "id") })
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Player.class)
    public class Player{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "games_admins", joinColumns = { @JoinColumn(name = "player_id") }, inverseJoinColumns = {
            @JoinColumn(name = "game_id") })
    private Set<Game> games;
    @Entity
    @Table(name = "game", uniqueConstraints = { @UniqueConstraint(columnNames = "id") })
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Game.class)
    public class Game{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToMany(mappedBy = "games")
    private Set<Player> players;

Поэтому, когда я отправляю запрос GET, чтобы получить всех игроков, я хочу получить что-то подобное

[
  {
    "id": 1,
    "name": "Player1",
    "games": [
      {
        "id": 1,
        "name": "game1",
        "players": [1, 2, 3]
      },
      {
        "id": 2,
        "name": "game2",
        "players": [1, 3]
      },
      {
        "id": 3,
        "name": "game3",
        "players": [1, 2]
      }
    ]
  },
  {
    "id": 2,
    "name": "Player2",
    "games": [
      {
        "id": 1,
        "name": "game1",
        "players": [1, 2, 3]
      },
      {
        "id": 3,
        "name": "game3",
        "players": [1, 2]
      }
    ]
  },
  {
    "id": 3,
    "name": "Player3",
    "games": [
      {
        "id": 1,
        "name": "game1",
        "players": [1, 2, 3]
      },
      {
        "id": 2,
        "name": "game2",
        "players": [1, 3]
      }
    ]
  }
]

Поэтому, когда мы снова достигаем «игрока», мы не перечисляем игры, а их идентификаторы, чтобы избежать рекурсии. То же самое должно применяться к играм.

Но я получаю вот что:

[
  {
    "id": 1,
    "name": "Player1",
    "games": [
      {
        "id": 2,
        "name": "game2",
        "players": [
          1,
          {
            "id": 3,
            "name": "Player3",
            "games": [
              2,
              {
                "id": 1,
                "name": "game1",
                "players": [
                  {
                    "id": 2,
                    "name": "Player2",
                    "games": [
                      1,
                      {
                        "id": 3,
                        "name": "game3",
                        "players": [2, 1]
                      }
                    ]
                  },
                  1,
                  3
                ]
              }
            ]
          }
        ]
      },
      1,
      3
    ]
  },
  2,
  3
]
...