【问题标题】:REST API - nested objectsREST API - 嵌套对象
【发布时间】:2016-02-22 14:19:38
【问题描述】:

我即将设计我的 rest API。我想知道如何处理如下对象:

@Entity
public class Foo {
@ManyToMany
private Set<Bar> barSet;
@OneToMany
private Set<Zzz> zzzSet;
}

如您所见,我想向我的 rest API 公开的对象由其他实体集合组成。我正在使用 Spring 4 和 Jackson。是否可以像上面那样返回对象 - 还是我必须只创建具有原始值的类?

【问题讨论】:

  • 你可以很容易地返回像foo这样的对象,但是你需要在你的bar类中忽略对foo的引用,否则jackson会崩溃。
  • 太棒了。你能告诉我如何做到这一点吗?
  • 使用@JsonIgnore注解,在bar类中注解foo的引用。这将阻止您获得循环依赖。

标签: java spring hibernate rest


【解决方案1】:

是的,这是可能的,但你必须处理 2 个问题:

1) 在序列化时,Jackson 将调用 getter Foo.getBarSet()。这会崩溃,因为默认情况下,Hibernate 返回 @OneToMany@ManyToMany 关系的惰性集合。

如果您不需要它们,请使用 @JsonIgnore 注释它们:

@Entity
public class Foo {

  @JsonIgnore
  @ManyToMany
  private Set<Bar> barSet;

  @JsonIgnore
  @OneToMany
  private Set<Zzz> zzzSet;
}

如果你需要它们,你必须告诉 hibernate 去加载它们。例如,您可以使用fetch = FetchType.EAGER 注释@ManyToMany@OneToMany(顺便说一句,这不是唯一的解决方案):

@Entity
public class Foo {

  @ManyToMany(fetch = FetchType.EAGER)
  private Set<Bar> barSet;

  @OneToMany(fetch = FetchType.EAGER)
  private Set<Zzz> zzzSet;
}

2) 它也可能导致一些无限循环:

  • Foo 调用的序列化Foo.getBarSet()
  • Bar 调用序列化Bar.getFoo()
  • Foo 调用的序列化Foo.getBarSet()
  • [...]

这可以用@JsonManagedReference@JsonBackReference 处理:

@Entity
public class Foo {

  @JsonManagedReference
  @OneToMany
  private Set<Zzz> zzzSet;

另一方面:

@Entity
public class Zzz {

  @JsonBackReference
  private Foo parent;
}

【讨论】:

    猜你喜欢
    • 2018-05-18
    • 2015-05-31
    • 1970-01-01
    • 2014-05-21
    • 2015-12-22
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多