【发布时间】:2020-05-12 01:00:49
【问题描述】:
我有两个班级,车主和自行车。所有者引用了自行车列表。自行车引用了一个所有者。
查询时,我希望返回的 json 将引用向下扩展一级。因此,每条自行车记录都会扩大所有者参考。并且每个所有者记录都会扩展每个自行车参考。我当然要避免无限递归!
这就是我想要的。
~$ curl -H "授权:不记名$TOKEN" -k -w "\n" https://mint191:8453/api/v1/bicycles [ { "id": 1, "model": “公民”,“所有者”:{“id”:1,“用户名”:“user1”}},{ “id”:2,“模型”:“蒙彼利埃”,“所有者”:{ “id”:2, "userName": "user2" } }, { "id": 3, "model": "cambridge", “所有者”:{“id”:3,“用户名”:“user3”,}},{“id”:4, “模型”:“tern A7”,“所有者”:{“id”:2,“用户名”:“user2” } } ]
~$ curl -H "授权:不记名$TOKEN" -k -w "\n" https://mint191:8453/api/v1/owners [ { "id": 1, "userName": “用户1”,“自行车”:[{ “身份证”:1, “模型”:“公民”,}]},{“id”:2,“用户名”:“user2”,“自行车”:[{ “身份证”:2, “模型”:“蒙彼利埃”},{ “身份证”:4, “模型”:“tern A7”}]},{“id”:3,“用户名”:“user3”,“自行车”:[{ “身份证”:3, “模型”:“剑桥”,} ] } ]
这里是课程。如代码所示,上面的两个rest api调用会导致无限递归。
public class Owner {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "owner_gen")
private long id;
@NotNull
@Size(min = 4, max = 10)
private String userName;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner")
private List<Bicycle> bicycles;
}
public class Bicycle {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "bike_gen")
private long id;
private String model;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "owner_id", nullable = false)
private Owner owner;
}
到目前为止,我已经尝试过@JsonManagedReference、@JsonBackReference。使用@JsonBackReference 的类不展开,使用@JsonManagedReference 的类展开。并且没有无限递归。差不多了。
我也尝试过@JsonIdentityInfo。这里的问题是任何记录只完整列出一次。列出后,对该记录的任何进一步引用都只是 id。因此,如果车主有多辆自行车,列出自行车将显示自行车 A 的展开车主,但仅显示自行车 B 的车主 ID,因为该车主已包含在响应中。
我不认为我要求的东西特别不寻常(?)并且查看各种页面总是使用非常简单的数据或仅从一个方向处理数据。我意识到这是更多的数据,但它确实使任何编程变得更加容易。
我需要自定义序列化程序吗?
谁能提供建议?
【问题讨论】:
-
请不要描述代码和结构,展示它们。试试minimal reproducible example。
-
昨天更新。
标签: hibernate spring-boot jackson