【问题标题】:How to avoid json response recursiveness in parent-child jpa relationship?如何避免父子jpa关系中的json响应递归?
【发布时间】:2021-12-02 02:34:58
【问题描述】:

我有这个问题,我以前没有遇到过,所以我寻求帮助。 我有这个实体类

@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder(toBuilder = true)
@Entity
@Table(name = "persons")
class Person {

       @Id
       @GeneratedValue(generator = "uuid")
       @GenericGenerator(name = "uuid", strategy = "uuid2")
       @Type(type = "uuid-char")
       private UUID id;

       @Column
       private String name;

       @Column
       private int age;

       @EqualsAndHashCode.Exclude
       @ToString.Exclude
       @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
       @JoinTable(name = "person_contact", joinColumns = {@JoinColumn(name = "person_id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name = "contact_id", referencedColumnName = "id")})
       private Set<Person> contacts;
}

我遇到的主要问题是,当我将此实体映射到具有与上面显示的相同属性的某个 DTO 时,当我从控制器端检索它作为响应时,我得到递归,因为有些东西不正确“接触”关系。我怎样才能摆脱这个问题?我只想一次又一次地从集合中检索 ID、年龄和姓名,而不是集合本身。我怎么能忽略它?

【问题讨论】:

  • @JsonIdentityInfo.

标签: java json spring-boot jpa jackson-databind


【解决方案1】:

我看到了两种“解决”这个问题的方法:

  1. 只需从 DTO 中删除 Set&lt;Person&gt; 属性即可。
  2. 如果您使用此属性并且只想在序列化为 JSON 时忽略它,请在字段中添加 @JsonIgnore 注释,它不会在响应中序列化。

--编辑 根据评论,您想添加此字段,并让它显示Person 集合的数据,但那些不应该显示他们的“联系人”。 您可以创建仅具有前 3 个字段的第二个 DTO 类,而不是将 Set&lt;Person&gt; 添加到主 DTO,而是添加 Set&lt;PersonContactDto&gt; 或类似名称。

【讨论】:

  • 但我希望联系人进入我的回复但没有联系人集合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多