我发现了很多资源,比如这个 - 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