[問題] Spring展開JPA物件成JSON的問題

作者: kyleJ (資工人)   2017-01-16 23:28:41
大家好,我最近使用Spring boot做REST API遇到個問題
在使用Spring的RestController讓method直接return一個物件
Spring會自動把物件轉為JSON String送給client
但我的JPA物件因為有關連的關係
Class A會指向Class B,Class B也會只回Class A
所以物件被展開成JSON String時就沒完沒了直到Exception了..
使用套件:
spring-boot-starter-web
spring-boot-starter-data-jpa
spring-boot-devtools
我用個範例來描述我的問題
@Entity
public class Type{
@id
private String name;
@OneToMany(mappedBy="type")
private List<Content> contents;
// getter and setter
}
@Entity
public class Content{
@Id
private String name;
@ManyToOne
private Type type;
// getter and setter
}
@RestController
public class Controller{
// @Autowired something...
@GetMapping("/show-types")
public Interable<Type> showTypes(){
return typeDao.findAll();
}
}
基本上就是Type裡面紀錄的很多Content
但為了存到資料庫裡有關聯,Content也可以指回去自己屬於哪個Type
所以透過網址呼叫/show-types時
Spring展開了Type發現有Content,就展開了Content
展開Content時又發現有Type,所以又展開了Type...
一直持續下去,然後就當了XD
想請問有什麼辦法讓Spring展開到Content後就忽略裡面的type field
或是有其他方法能解決掉這個無限遞迴的問題?
謝謝!
作者: csieflyman (風之驕子)   2017-01-16 23:46:00
jackson @JsonIdentityInfojackson @JsonIgnore
作者: kyleJ (資工人)   2017-01-17 00:49:00
感謝!!用第二個方法直接加在field name上就成功了!!
作者: adrianshum (Alien)   2017-01-21 09:10:00
以前也踫過類似問題(是XML/JAXB 而不是JSON罷了)用過類似上面的方法。最後還是放棄(不想把entity被presentation相關的東西污染)。改為把entity 先轉成valueobject(進來的則是value object 轉entity),雖然多了classes不過整體乾淨很多
作者: NullLife (廢材大叔有點累)   2017-01-25 17:07:00
我的建議是entity就讓他活在jvm裡吧要往外丟請重新設計vo

Links booklink

Contact Us: admin [ a t ] ucptt.com