我正在开发一个公开REST API的Spring Boot Web应用程序,并且在JSON序列化方面遇到麻烦。
比方说,我有两个A和B类,它们是一对多的双向关系。
这意味着我有这样的东西:
public class A {
private List<B> bList;
...
}
和
public class B {
private A owner;
...
}
当涉及到JSON序列化时,当然会有一个循环。
这是我的问题:
A
的API方法中(例如“向我提供数据库中所有As的列表”),我想要JSON序列化,其中:
A
对象确实包含B
个列表B
对象不包含其A所有者B
的API方法中(例如“给我DB中所有B
的列表”),我想要JSON序列化,其中:
A
对象不包含其B
的列表B
对象确实包含其A
所有者我相信我可以将其与@JsonView
注释一起使用,但是我认为这不是一个优雅的解决方案。在我的应用程序(具有两个以上的类)中,我需要创建和管理至少4或5个JsonViews:因此,在我的模型类中,对于每个属性,我必须管理一堆杂乱的@JsonView
注释。相反,我认为模型类不应意识到这样的事实,即它们根据API方法具有不同的JSON表示形式。
我搜索了如何使用自定义JSON序列化程序,并发现Jackson允许使用其SimpleModule进行此操作。但是,似乎SimpleModule不允许逐案选择使用哪个序列化程序(它始终使用最后添加的序列化程序)。
所以我现在有点笨了。有谁知道允许控制器选择如何序列化类的干净方法?
答案 0 :(得分:0)
我认为您应该在此处使用DTO
,可以将不同的DTO
用于不同的端点,还可以选择要包括或排除的字段。另外,如果需要,可以装饰它们。
以下列出了在端点中使用DTO
的好处:REST API - DTOs or not?
答案 1 :(得分:0)
使用@JsonIdentityInfo
您的问题已在此处回答:Jackson - serialization of entities with birectional relationships (avoiding cycles)
答案 2 :(得分:0)
您可以对实体使用@JsonIdentityInfo
批注,也可以使用@JsonManagedReference
,@JsonBackReference
。
您甚至可以忽略与@JsonIgnore
或@JsonView
的关系的一方。
如果您想自己管理序列化/反序列化,请使用自定义实现(例如,使用@JsonDeserialize
)。
Eugen为此提供了一个不错的tutorial。