I found many resources on this, such as this Endless recursion with the release of Jackson JSON and Hibernate JPA . I tried to implement all the various suggestions described there (including basic @JsonIgnore), but to no avail. I can't get anything but endless recursion errors, no matter what I'm trying to do. I think I have a pretty similar / typical setup, but obviously with something wrong, because despite using @JsonManagedReference, @JsonBackReferencere and @JsonIdentityInfo annotations, I keep getting the error.
My tables are "exchange" and "stock", with many of them between them, and I tested them through ExchangeEndpoint. I confirmed that if I completely remove the βstockβ from the βexchangeβ object, the service works fine, but for some reason, json annotations do not seem to affect. Below I think this is a solution based on the second (but more popular) answer in the above Endless recursion with Jackson JSON and Hibernate JPA problem .
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; }
edit:
some error conclusion to be sure that I am not misinterpreting something;
15: 35: 16,406 ERROR [org.jboss.resteasy.resteasy_jaxrs.i18n] (http- / 0.0.0.0: 8080-1) RESTEASY000100: Failed to execute GET / exchange /: org.jboss.resteasy.spi.WriterException: org .codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError) (via the chain of links: net.hb.forge2RestServices.model.Exchange ["shares"] β org.hibernate.collection.internal.PersistentSet [0] β net.hb .forge2RestServices.model.Stock ["exchange"] β net.hb. forge2RestServices.model.Exchange ["shares" β org.hibe ...... Exchange ["share"] β org.hibernate.collection.internal .PersistentSet [0] β [net.hb.forge2RestServices.model.Stock "share"] β [net.hb.forge2RestServices.model.Exchange "share"]) on org.jboss.resteasy.core.ServerResponse.writeTo (ServerResponse .java: 262)
Please let me know what additional information I can provide to help explain my debacle. Tia.