2014-01-17 47 views
3

我有一個一對多的雙向關係,parent實體和child實體(ie.parent有一個或多個孩子,孩子只有一個父母)在使用JPA和Hibernate進行持久化的Spring MVC REST服務中。Spring MVC REST JPA Hibernate Jackson無限遞歸一對多JSON錯誤

每當我嘗試返回JSON父實體的名單,我得到這樣的事情在一個無限循環如下:

[{"businessName":"Cake Shop","businessDescription":"We sell cakes","businessId":1,"promotions":[{"name":"Cake Sale","id":1,"description":"Get free cakes","business":{"businessName":"Cake Shop","businessDescription":"We sell cakes","businessId":1,"promotions":[{"name":"Cake Sale","id":1,"description":"Get free cakes","business" 

,出現以下錯誤:

com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError)

以下是我的控制器:

@RequestMapping(value="/getBusinesses", method = RequestMethod.GET) 
@ResponseBody 
public List<Business> getAllBusinessTypes(){ 

    List<Business> businesses = businessService.findAllBusinesses(); 

    return businesses; 
} 

and my 2 e ntities是:

@Entity 
public class Business implements Serializable{ 

    @Id 
    @GeneratedValue 
    private Long businessId; 
    private String businessName; 
    private String businessDescription; 



    @OneToMany(mappedBy = "business", cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    private List<Promotion> promotions = new ArrayList<Promotion>(); 


    public String getBusinessDescription() { 
     return businessDescription; 
    } 

    public void setBusinessDescription(String businessDescription) { 
     this.businessDescription = businessDescription; 
    } 

    public String getBusinessName() { 
     return businessName; 
     } 

    public void setBusinessName(String businessName) { 
     this.businessName = businessName; 
    } 

    public Long getBusinessId() { 
     return businessId; 
    } 

    public void setBusinessId(Long businessId) { 
     this.businessId = businessId; 
    } 


    public List<Promotion> getPromotions() { 
     return promotions; 
    } 

    public void setPromotions(List<Promotion> promotions) { 
     this.promotions = promotions; 
    } 

}

@Entity 
@Table(name = "promotions") 
public class Promotion implements Serializable{ 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToOne 
    private Business business; 

    private String name; 
    private String description; 


    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 


    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public Business getBusiness() { 
     return business; 
    } 

    public void setBusiness(Business business) { 
     this.business = business; 
    } 
} 

我已經傑克遜在內,應該把它不會自動轉換JSON還是我愚蠢和缺少明顯的東西?

回答

15

我找到了解決辦法here

http://fasterxml.github.io/jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/JsonManagedReference.html

https://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonBackReference.html

我不得不@JsonManagedReference註釋添加到getter方法我促銷名單在我的業務對象(以下簡稱「一個」在我的一對多關係)如下:

@Entity 
public class Business implements Serializable{ 

    ... 

    @JsonManagedReference 
    public List<Promotion> getPromotions() { 
     return promotions; 
    } 

and @JsonBackReference to the gett呃在我的推廣對象我的業務對象(在我的一對多關係中的「多」),像這樣:

@Entity 
public class Promotion { 

    ... 

    @JsonBackReference 
    public Business getBusiness() { 
     return business; 
    } 

看來這種類型的雙向關係,導致與傑克遜序列化問題。

也必須使用傑克遜1.6或更高版本。

+0

任何序列化框架都存在雙向關係問題。我不知道傑克遜支持這個:-)。 – greyfairer

+0

謝謝!你拯救了我的一天。 – Chris

+0

真棒問題...真棒回答... –

相關問題