我有一个与JPA关系的OneToMany代码。 Customer具有要检出的Item列表。但是,代码继续生成StackOverflowError

有一次,我通过从客户实体中获取@JsonIgnore时应用List<Item>解决了这一问题。但这似乎不再起作用。

Customer类中:

@OneToMany(mappedBy = "customer", orphanRemoval = true)
@JsonIgnore
private List<Item> items;


Item类中:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CUSTOMER_ID", nullable = false)
private Customer customer;


CustomerRest类:

@Path("customers")
public class CustomerRest {

    @Inject
    NewSessionBean newSessionBean;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Customer> getAllCustomers() {
        return newSessionBean.getCustomers();
    }
}


方法newSessionBean.getCustomers()

public List<Customer> getCustomers(){
    TypedQuery<Customer> q= em.createQuery("select c from Customer c", Customer.class);

    return q.getResultList();
}


我期望格式正确的JSON消息,但是没有任何迹象。我得到的只是浏览器上的java.lang.StackOverflowError,服务器日志生成以下内容:

Generating incomplete JSON|#]
    java.lang.StackOverflowError
    java.lang.StackOverflowError    at org.eclipse.yasson.internal.serializer.DefaultSerializers.findByCondition(DefaultSerializers.java:130)

最佳答案

看起来您使用的是Yasson项目而不是Jackson。在这种情况下,应使用@JsonbTransient批注。参见documentation


  默认情况下,JSONB忽略具有非公共访问权限的属性。所有
  公共财产-具有以下内容的公共领域或非公共领域
  公共获取者被序列化为JSON文本。
  
  可以使用@JsonbTransient批注来排除属性。
  用@JsonbTransient注释注释的类属性将被忽略
  通过JSON Binding引擎。行为因位置而异
  放置@JsonbTransient批注。


也可以看看:


Circular reference issue with JSON-B

09-10 09:26