2016-02-11 46 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