加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

java – REST控制器中具有一对多关系的实体的递归JSON视图

发布时间:2020-12-15 01:36:59 所属栏目:大数据 来源:网络整理
导读:我正在使用SpringBoot和JPA来构建REST接口. 现在,我为从数据库中提取的产品列表返回了一个奇怪的JSON.让我们说我有: @Entitypublic class Product { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @ManyToOne(optional = false,fe

我正在使用SpringBoot和JPA来构建REST接口.

现在,我为从数据库中提取的产品列表返回了一个奇怪的JSON.让我们说我有:

@Entity
public 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;

    ...
}

@Entity
public 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

在我的控制器中我有:

@Autowired
private 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()方法时需要一个列表.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读