我想知道为什么我的控制器给出嵌套响应

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

在Spirngboot中,当我从一个表中获取与另一个表记录关联的任何记录时,我使用了JpaRepository,在这种情况下我得到了递归数据。 例如我有两个表(工作和公司),工作在实体上有公司字段,公司在公司实体上有工作字段设置。

这是我的回复示例 enter image description here

这是我的工作实体

@Entity
public class Jobs {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(unique = true)
    private String title;
    
    @ManyToOne( fetch = FetchType.LAZY)
    @JoinColumn(name = "company")
    private Company company;
..,

公司实体


@Entity
public class Company {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    @Column(nullable = false, unique = true)
    private String name;
    
    @Column(length = 1500)
    private String about; 

    @Column( length = 600)
    private String companyLogoLink;
    
    @OneToMany(mappedBy = "company", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<Jobs> jobs;
..,

我已经在注释处尝试过Lazy loader

我预计当我保存任何新的工作记录时。其返回工作和关联公司记录不是与公司关联的工作记录。 喜欢

job{
   id:
   title:
   company: { 
       id:
       company_name:
       jobs: {
              avoid here repeated;
             }
java mysql spring-boot jpa many-to-many
1个回答
0
投票

当您延迟获取时,当调用 getter 时,会按需从数据库检索数据。

Jackson 默认使用 getter/setter 进行序列化/反序列化。当它调用 getter 时,jpa 检索数据,然后在序列化新数据时调用 getter,jpa 检索更多数据,依此类推。我很惊讶你在这里没有收到 stackoverflow 错误,json 格式不能表示对象之间的循环引用,这在 java 中是绝对合法的。

解决方案:

  1. 使用良好实践 - 对于反/序列化,使用 DTO(数据传输对象),而不是实体(这是不好的实践)。
  2. @JsonIgnore
    关于您不需要的属性。
  3. @JsonIdentityInfo
    等jackson注解,可以处理循环引用。
© www.soinside.com 2019 - 2024. All rights reserved.