2017-04-09 60 views
0

我正在编写一个使用RestController来公开一个资源的Spring引导应用程序。唯一的资源,MainResource,是这样的:库中的自定义Jackson序列化

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

为了使这项工作我写的MainResource和的GObject及其字段,在必要的DTO。我用杰克逊注释了DTO,并写了返回域模型的DTO-Mappers。 Spring正确地将请求序列化到DTO,并且应用程序服务为域对象调用DTO映射器。

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

我的目标是:

  1. 图书馆应在JSON/XML序列gObjects并返回域对象。
  2. 图书馆应采取域gObjects并返回序列化JSON/XML
  3. 启用已经使用杰克逊的应用程序尽可能与像Spring引导库例如
  4. 无缝协作提供了可能使用一些其他应用程序的简便方法像gson例如

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

编辑:我认为mixins的目的是有点什么我的DTOs和DTO映射器是有点做自定义de/serializer应该。有没有办法将两者混合?

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

回答

1

如果您只是在您的DTO类上使用注释,那么其他任何弹簧项目都可以对这些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,则需要在模块中对其进行配置。

如果您正在使用自定义串行器,则需要在模块中配置它们,如示例中所示。

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

+0

感谢您的回答。我认为这是我前进的方向,所以你加强了我的方法。我所看到的问题是生成XML,据我所知,注释是设置属性等唯一方法。我想我会需要一些mixin ... – jam01