2016-02-22 89 views
0

我即將設計我的rest API。我想知道如何處理下面的對象:REST API - 嵌套對象

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

正如你看到的對象我想暴露給我的rest API由其他實體集合組成。我正在使用Spring 4和Jackson。是否有可能像上面那樣返回對象 - 或者我只需要創建具有原始值的類?

+0

您可以輕鬆地返回類似foo對象,但那麼你需要忽略你在酒吧課的引用,否則傑克遜會崩潰。 – kai

+0

太好了。你能告訴我如何做到這一點? –

+0

使用@JsonIgnore註釋並在條類中註釋foo的引用。這會阻止你獲得循環依賴。 – kai

回答

3

是的,這是可能的,但你必須處理兩個問題:

1)在系列化,傑克遜將調用吸氣Foo.getBarSet()。這將會崩潰,因爲默認情況下,Hibernate會返回@OneToMany@ManyToMany關係的懶惰集合。

如果你不需要他們,@JsonIgnore註釋它們:

@Entity 
public class Foo { 

    @JsonIgnore 
    @ManyToMany 
    private Set<Bar> barSet; 

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

如果需要的話,你必須告訴Hibernate來加載它們。例如,你可以註釋@ManyToMany@OneToManyfetch = FetchType.EAGER(這不是BTW唯一的解決辦法):

@Entity 
public class Foo { 

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

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

2)它也可能會導致一些無限循環:

  • 富調用的序列化Foo.getBarSet()
  • 酒吧電話的序列化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; 
}