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