我正在使用SpringBoot和JPA来构建REST接口.
现在,我为从数据库中提取的产品列表返回了一个奇怪的JSON.让我们说我有:
@Entitypublic class Product { @ID @GeneratedValue(strategy = GenerationType.auto) private Long ID; @ManyToOne(optional = false,fetch = FetchType.LAZY) @JoinColumn(name = "categoryID",nullable = false,updatable = false) private category category; ...}@Entitypublic class category implements Serializable { @ID @GeneratedValue(strategy = GenerationType.auto) private Long ID; @OnetoMany(mappedBy = "category",cascade = CascadeType.DETACH) @OrderBy("name ASC") private List
产品的JPA存储库定义为:
public interface ProductRepository extends JpaRepository
在我的控制器中我有:
@autowiredprivate ProductRepository productRepo;@RequestMapPing("/all-products",method = RequestMethod.GET)public Map
让我疯狂的是,如果我尝试按如下方式调用此服务:
$curl localhost:8080/all-products
由于表产品和类别之间的关系,我得到一个递归输出,例如:
{"products":[{"ID":1,"name":"Product1","category":{"ID":1,"name":"Cat1","products":[{"ID":6,"name":"Product6",...
我究竟做错了什么?最佳答案你没有做错任何事情(至少在代码级别它是相当概念性的) – Json序列化器就像这样:
>产品 – 序列化它,但等待 – 有一个类别字段,因此序列化程序必须序列化类别字段
>类别 – 序列化它,但等待 – 有一个产品字段,因此序列化程序必须序列化列表中的每个产品
>产品 – 因为您的产品系列包含产品和产品.产品包含类别,它进入无限循环,直到超时.
您必须使用视图或只是跳过它.
>使用@JsonView
>将视图用作POJO
将具有产品的所有字段和引用(类别)的新ProductVIEw返回到新的categoryVIEw(此时可以结束),其中包含(产品)新ProductVIEwWithoutReferences的集合,依此类推
>在一系列产品上使用@JsonIgnore
并且作为旁注 – 如果它是@RestController并且您正在调用“所有产品”,那么返回除列表之外的其他东西有点不寻常.在地图中包装响应是多余的.许多其他客户端在调用List()方法时需要一个列表. 总结
以上是内存溢出为你收集整理的java – REST控制器中具有一对多关系的实体的递归JSON视图全部内容,希望文章能够帮你解决java – REST控制器中具有一对多关系的实体的递归JSON视图所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)