一对多Json对杰克逊的回应不起作用

问题描述 投票:0回答:1

我有一个问题使用JPA和关系一对多与杰克逊和春天休息......我试图找到多个解决方案,但任何事情对我有用,我不知道问题出在哪里。

例如,我有一个表团队,其中包含一对多/多对一的关系

我有两个存储库用于Team,另一个用于Player

Team  >>> has Many >> Player
Player >>> many to one >> Team

我的实体团队有以下内容

@Entity
@Table(name = "teams")
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Team {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private long teamId;

    private String abbreviation;

    private String team;

    private String simpleName;

    private String logo;

    @OneToMany(cascade = {CascadeType.ALL,CascadeType.PERSIST,CascadeType.MERGE}, mappedBy = "team")
    @Column(nullable = false)
    private List<Player> players;

    Theirs getters/setter , hashcodes and string similars.

另一方面是实体玩家

    @Entity
@Table(name = "player")
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Player {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    private long id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "teams_id", nullable=true)
    private Team team;

    private String name;

所以,我在存储库中的控制器中进行了典型的get调用。

@RestController
@RequestMapping("/api/public/team")
public class TeamController {

    @Autowired
    private TeamRepository teamRepository;

    @Autowired
    private GenericMethods genericMethods;

    @GetMapping(value = "/{id}")
    public Team getPersona(@PathVariable("id") int id) {
        return teamRepository.findOne(genericMethods.toLong(id));
    }

和存储库

@Repository
public interface TeamRepository extends JpaRepository<Team, Long> {

}

现在,当我调用此端点时,我收到以下答案,我认为这是不正确的,我只需要一个带有播放器的列表

{  
   "id":2,
   "teamId":0,
   "abbreviation":null,
   "team":null,
   "simpleName":"Betis",
   "logo":null,
   "players":[  
      {  
         "id":1,
         "team":2,
         "category":{  
            "id":1,
            "nombre":"juvenil a",
            "language":null,
            "description":null,
            "league":[  

            ],
            "players":[  
               1,
               {  
                  "id":2,
                  "team":2,
                  "category":1,
                  "name":"hulio"
               }
            ]
         },
         "name":"pepe"
      },
      2
   ]
}

我需要访问Player和Team的信息,所以我不能使用@JsonIgnoreProperties

任何人都可以帮忙解决这个问题吗?

java spring rest api
1个回答
1
投票

根据您真正想要实现的目标,您可以尝试不同的选择。我不确定你是否正在使用(或打算使用)spring-data-rest。

1.专用存储库

如果相关实体没有自己的存储库,Spring数据将会嵌入相关实体。尝试创建public interface PlayersRepository extends JpaRepository...

2.懒加载

你为什么使用FetchType.EAGER?试试没有它。

3.预测

预测仅适用于列表,而不适用于单个实体(即不明确要求您提供的内容)。您可以隐藏Teams集合中的玩家,即使它是默认返回的,如下所示:

@Projection(name = "noPlayers", types = { Team.class })
public interface TeamWithoutPlayers {

    Long getId();
    long getTeamId();
    String getAbbreviation();
    String getTeam();
    String getSimpleName();
    String getLogo();
}

More info - Spring Data Rest Projections

4.使用Team@JsonIgnore实体中序列化期间忽略

@JsonIgnore
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "teams_id", nullable=true)
private Team team;

最后的想法

使用spring-data-rest,您可以扩展CrudRepository而不是JpaRepository,并直接通过存储库访问该项目。这样你就不需要编写控制器了。

© www.soinside.com 2019 - 2024. All rights reserved.