0

我正在编写一个使用 RestController 来公开一个资源的 Spring Boot 应用程序。唯一的资源 MainResource 是这样的:

String id; String title; List<String> tags; ComplexGraphObject gObject;

为了完成这项工作,我在必要时为 MainResource 和 gObject 及其字段编写了 DTO。我用 Jackson 注释了 DTO,并编写了返回域模型的 DTO-Mappers。Spring 正确地将对 DTO 的请求序列化,并且应用程序服务为域对象调用 DTO-Mappers。

我现在意识到 gObject 应该是它自己的库,因为我们想将它用于客户端和服务器应用程序。

我的目标是:

  1. 该库应采用 json/xml 中的序列化 gObjects 并返回域对象。
  2. 该库应采用域 gObjects 并返回序列化的 json/xml
  3. 使已经使用 Jackson 的应用程序尽可能与 Spring Boot 等库无缝协作
  4. 为其他可能使用诸如 gson 之类的应用程序提供方便的方法

从我读到的自定义杰克逊 de/serializer 是要走的路。但是在自定义序列化程序、ObjectMapper、MixIns 等之间,我不知道该怎么做。

编辑:我认为 mixins 的目的有点像我的 DTO 正在做的事情,而 DTO-Mapper 有点像自定义 de/serializer 应该做的事情。有没有办法混合两者?

编辑:我忘记了重要的部分。DTO-Mapper 从 DTO 生成域对象以及表示图中每个节点所需关系的矩阵,以便可以相应地连接它们。所以我想我需要在自定义序列化程序中这样做?

4

1 回答 1

1

如果您仅在 DTO 类上使用注释,则任何其他 spring 项目都可以序列化/反序列化这些 DTO,而无需额外配置。对我来说,这是自定义序列化的首选方式。

如果您更改 ObjectMapper 的配置,您的库的用户也需要这样做。您可以实现一个杰克逊模块:

@Component
public class DateTimeModule extends SimpleModule {

public DateTimeModule() {
    super(DateTimeModule.class.getName(), Version.unknownVersion());
    //do whatever you need here....
    addSerializer(DateTime.class, new DateTimeSerializer());
    addDeserializer( DateTime.class, new DateTimeDeserializer(DateTime.class));
}
}

您的库的用户必须将模块注册到 ObjectMapper

  • ObjectMapper#findAndRegisterModules
  • ObjectMapper#registerModules

春天有不同的方法可以做到这一点,请参阅这篇文章

Jackson Mixins允许对类使用序列化注释,您不能修改。如果你使用 Mixins,你需要在 Module 中配置它们。

如果您使用自定义序列化程序,则需要在模块中配置它们,如示例所示。

序列化图形听起来像是自定义序列化程序的用例。

于 2017-04-09T08:40:50.850 回答