繁体   English   中英

Spring Boot + Jackson:根据所调用的REST API以不同的方式序列化对象

[英]Spring Boot + Jackson: Serialize an object in different ways depending on the called REST API

我正在开发一个公开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不允许视情况选择要使用的序列化程序(它始终使用最后添加的序列化程序)。

所以我现在有点笨了。 有人知道允许控制器选择如何序列化类的一种干净方法吗?

我认为您应该在此处使用DTO ,可以对不同的终结点使用不同的DTO ,并且可以选择要包括或排除的字段。 另外,如果需要,可以装饰它们。

在这里,您有在端点中使用DTO的好处的列表: REST API-是否使用DTO

使用@JsonIdentityInfo

您的问题已在此处回答: Jackson-具有双向关系的实体的序列化(避免循环)

您可以对实体使用@JsonManagedReference批注,也可以使用@JsonIdentityInfo@JsonBackReference

您甚至可以使用@JsonIgnore@JsonView忽略关系的@JsonView

如果要自己管理序列化/反序列化,请使用自定义实现(例如@JsonDeserialize )。

Eugen为此提供了很好的教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM