2016-02-11 49 views
6

我發現了很多資源,比如這個 - Infinite Recursion with Jackson JSON and Hibernate JPA issue。我已經嘗試來執行那裏描述的所有各種建議(包括基本@JsonIgnore),但無濟於事。無論我嘗試什麼,我都無法獲得除無限遞歸錯誤以外的任何其他內容。我想我有一個非常相似/典型的設置,但顯然有錯誤,因爲儘管使用@JsonManagedReference,@JsonBackReferencere和@JsonIdentityInfo註釋,我不斷收到錯誤。傑克遜JSON和Hibernate JPA問題的無限遞歸(又一個)

我的表格是「交換」和「股票」,它們之間有許多許多,我一直在通過ExchangeEndpoint進行測試。我已經確認,如果我從「交換」實體完全刪除「股票」,該服務可以正常工作,但由於某種原因,json註釋似乎沒有任何影響。以下是我認爲認爲是基於上述Infinite Recursion with Jackson JSON and Hibernate JPA issue中第二個(但更受歡迎)答案的解決方案。

Exchange.java

@Entity 
@Table(name = "exchange", schema = "public") 
@XmlRootElement 
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id") 
public class Exchange implements java.io.Serializable { 
... 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "exchange") 
    @JsonManagedReference 
    public Set<Stock> getStocks() { 
     return this.stocks; 
    } 
... 

Stock.java

@Entity 
@Table(name = "stock", schema = "public") 
@XmlRootElement 
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id") 
public class Stock implements java.io.Serializable { 
... 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "exchangeid", nullable = false) 
    @JsonBackReference 
    @JsonIgnore 
    public Exchange getExchange() { 
     return this.exchange; 
    } 
... 

ExchangeEndpoint.java

@Stateless 
@Path("/exchanges") 
public class ExchangeEndpoint { 
    @PersistenceContext(unitName = "postgresql-ss4") 
    private EntityManager em; 
... 
    @GET 
    @Produces("application/json") 
    public List<Exchange> listAll(@QueryParam("start") Integer startPosition, 
      @QueryParam("max") Integer maxResult) { 
     TypedQuery<Exchange> findAllQuery = em 
       .createQuery(
         "SELECT DISTINCT e " 
         + "FROM Exchange e " 
         + "LEFT JOIN FETCH e.stocks " 
         + "ORDER BY e.exchangeid", 
         Exchange.class); 
     if (startPosition != null) { 
      findAllQuery.setFirstResult(startPosition); 
     } 
     if (maxResult != null) { 
      findAllQuery.setMaxResults(maxResult); 
     } 
     final List<Exchange> results = findAllQuery.getResultList(); 
     return results; 
    } 

編輯:

一些錯誤輸出,以確保我」我不會誤解某事;

15:35:16406 ERROR [org.jboss.resteasy.resteasy_jaxrs.i18n] (基於HTTP/0.0.0.0:8080-1)RESTEASY000100:無法執行GET /交流/:org.jboss。 resteasy.spi.WriterException: org.codehaus.jackson.map.JsonMappingException:無限遞歸 (StackOverflowError)(通過參考鏈: net.hb.forge2RestServices.model.Exchange [「stocks」] - > org.hibernate.collection .internal.PersistentSet [0] - > net.hb.forge2RestServices.model.Stock [「exchange」] - > net.hb.forge2RestServices.model.Exchange [「stocks」] - > org.hibe ... 。 .. 兌換[「股票」] - > org.hibernate.collection.internal.P ersistentSet [0] - > net.hb.forge2RestServices.model.Stock [「exchange」] - > net.hb.forge2RestServices.model.Exchange [「stocks」]) at org.jboss.resteasy.core.ServerResponse.writeTo (ServerResponse.java:262)

請讓我知道我可以提供什麼額外的信息來幫助解釋我的崩潰。 TIY。

回答

0

問題是你參考Stock s和回Stock你參考Exchange。因此JSON進入股票,回到Exchange然後爲Exchange它會生成所有的Stock s等等。

要打破這個循環,最好將JsonIgnore註釋放在引用父對象 - ManyToOne的字段中 - 在這種情況下,它是Stock.exchange字段(或者是getter的getter)。

+0

我想在幾個不同的方式加入JsonIgnore註解,但它仍然看起來並不像什麼行爲是不同的。我更新了其中一個原始問題,我剛剛加入了它,但我也嘗試替換JsonBackReference,並將註釋移到字段定義(而不是getter),但我似乎得到了相同的結果。有什麼方法可以使這些註釋變得否定? – swv

2

如果您不通過REST公開您的JPA實體,則更容易避免此類問題。

您應該考慮在REST端使用DTO並將實體映射到DTO,反之亦然,可以手動編碼映射器或使用MapStruct生成映射器。

作爲獎勵,您將避免安全問題。

+0

MapStruct看起來很有趣。我一直希望這個項目不會有足夠的複雜性來真正要求添加這樣的圖層,但我可以設想其他很多項目。感謝您的參考。 – swv

1

看來問題出在進口。我不知道爲什麼,但org.codehaus.jackson.annotate.JsonIgnore適合我,而com.fasterxml.jackson.annotation.JsonIgnore不適合。

1

使用@JsonManagedReference,@JsonBackReference

public class User { 
    public int id; 
    public String name; 

    @JsonBackReference 
    public List<Item> userItems; 
} 


public class Item { 
    public int id; 
    public String itemName; 

    @JsonManagedReference 
    public User owner; 
} 

需要注意的是:

@JsonManagedReference是參考前部 - 這通常被序列化的一個。 @JsonBackReference是引用的後面部分 - 它將從序列化中省略。

http://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion