Jackson JSON和Hibernate JPA问题的无限递归(又一个)

swv*_*swv 6 java json hibernate jpa jackson

我已经找到了大量的资源,例如这个 - 使用Jackson JSON和Hibernate JPA问题的无限递归.我试图实现那里描述的所有各种建议(包括基本的@JsonIgnore),但无济于事.无论我尝试什么,我都无法得到除无限递归错误之外的任何东西.我认为我有一个非常相似/典型的设置,但显然有一些错误,因为尽管使用@JsonManagedReference,@ JsonBackReferencere和@JsonIdentityInfo注释,我仍然得到错误.

我的表是"交换"和"股票",它们之间有很多很多,我一直在通过ExchangeEndpoint进行测试.我已经确认,如果我从"交换"实体中完全删除"股票",该服务工作正常,但由于某种原因,json注释似乎没有任何影响.以下是我认为是基于Jackson JSON和Hibernate JPA问题的上述无限递归中的第二个(但更受欢迎)答案的解决方案.

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;
    }
...
Run Code Online (Sandbox Code Playgroud)

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;
    }
...
Run Code Online (Sandbox Code Playgroud)

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;
    }
Run Code Online (Sandbox Code Playgroud)

编辑:

一些错误输出,以确保我不会误解一些东西;

15:35:16,406 ERROR [org.jboss.resteasy.resteasy_jaxrs.i18n](http-/0.0.0.0:8080-1)RESTEASY000100:执行GET/interchange /失败: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 ......交换["stock"] - > org.hibernate .collection.internal.PersistentSet [0] - > net.hb.forge2RestServices.model.Stock ["exchange"] - > net.hb.forge2RestServices.model.Exchange ["stocks"])org.jboss.resteasy.core .ServerResponse.writeTo(ServerResponse.java:262)

请让我知道我可以提供哪些其他信息来帮助解释我的崩溃.TIY.

Zby*_*000 3

问题是您引用了Stocks 并从Stock您引用了返回Exchange。因此,JSON 进入库存,返回Exchange,然后Exchange它将生成所有Stocks 等等。

要打破循环,最好将JsonIgnore注释添加到引用父对象的字段 - ManyToOne - 在本例中它是 Stock.exchange 字段(或该字段的 getter)。