首页 > 解决方案 > 在春季使用多对一映射时获得无限的Json响应

问题描述

我正在尝试在春季创建两个实体之间的多对一映射。但是,当我尝试使用 restController 获取值时,我得到

Java.lang.IllegalStateException:提交响应后无法调用 sendError()

错误和无限的 JSON 响应。添加 JSON 忽略解决了这个问题,但我的回复中根本没有得到该列。我不知道如何解决这个问题。请帮忙。提前致谢。

这是我的实体:

@Entity
@Table(name="tbl1")
public class Data {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "customer")
    private String customer;



    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="data_id", insertable = true, nullable = false, updatable = false)
    private DataList dataList1;

}

@Entity
@Table(name="tbl2")
public class DataList {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="data_id")
    private Long dataId;



    @Column(name="user_name")
    private String userName;



    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER,mappedBy = "dataList1")
    private List<Data> data1;


}

存储库:

@Repository
@Transactional
public interface DataList extends JpaRepository<DataList,Long> {
}
@Repository
@Transactional
public interface Data extends JpaRepository<Data,Long> {
}

我的错误:Java.lang.IllegalStateException: Cannot call sendError() after the response has been committed

标签: javajsonspringspring-bootjpa

解决方案


它正在发生,因为 JSON 序列化程序试图一次又一次地递归地序列化这两个实体。

所以,在序列化时Data,它的成员dataList1DataList进一步包含的类型List<Data>,这个循环将是无限的。

理想情况下,在这种情况下,实体应该映射到其他一些用于序列化和响应的模型,或者需要其中一个模型@JsonIgnore来避免这种递归循环。


推荐阅读