我有一个与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