【问题标题】:Custom Jackson serialization in library库中的自定义 Jackson 序列化
【发布时间】:2017-09-04 06:23:24
【问题描述】:

我正在编写一个 Spring 启动应用程序,它使用 RestController 来公开一个资源。唯一的资源 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 中的序列化 gObject 并返回域对象。
  2. 该库应采用域 gObjects 并返回序列化的 json/xml
  3. 让已经使用 Jackson 的应用程序尽可能与 Spring Boot 等库无缝协作
  4. 为可能使用诸如 gson 之类的其他应用程序提供方便的方法

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

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

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

【问题讨论】:

    标签: spring serialization spring-boot jackson jackson-modules


    【解决方案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

    春天有不同的方法可以做到这一点,see this post

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

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

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

    【讨论】:

    • 感谢您的回答。我认为这是我前进的方向,所以你正在加强我的方法。我看到迫在眉睫的问题是生成 XML,据我所知,注释是设置属性等内容的唯一方法。我想我会在某个地方需要一些 mixin...
    猜你喜欢
    • 2016-01-11
    • 2019-08-10
    • 1970-01-01
    • 2014-08-02
    • 2016-02-13
    • 2011-04-12
    • 2013-01-18
    • 2015-01-30
    • 1970-01-01
    相关资源
    最近更新 更多