1

我有一个关系JPA代码OneToMany。ACustomer有一个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)
4

1 回答 1

3

看起来您使用的是 Yasson项目而不是Jackson。在这种情况下,您应该使用@JsonbTransient注释。请参阅文档

默认情况下,JSONB忽略具有非公共访问权限的属性。所有公共属性——公共字段或具有公共 getter 的非公共字段都被序列化为JSON文本。

可以使用@JsonbTransient注释来排除属性。用注解注解的类属性@JsonbTransient会被JSON Binding引擎忽略。@JsonbTransient行为因注释的放置位置而异 。

也可以看看:

于 2019-08-04T16:14:42.290 回答