7. 域对象交涉

7.1. 对象映射

Spring Data REST返回对应于请求的HTTP请求中指定Accept类型的域对象的表示。

目前,只有JSON支持。其他表示类型可以在将来通过添加适当的转换器,并更新与适当的内容类型的控制器方法的支持。

有时候,Spring Data REST的对象映射,已专门配置为使用智能串行器,可以把域对象为链接,然后再返回,可能无法正确处理您的域模型的行为。有很多方法可以组织你的数据, 你会发现你自己的域模型没有被正确翻译成JSON。这也是有时在这些情况下,实际的尝试,并支持复杂的域模型的通用方法。有时,根据不同的复杂性,这可能提供一个通用的解决方案。

7.1.1. 添加自定义的串行器给Jackson的对象映射

为了适应用例的比例最大化,Spring Data REST很努力的试图正确地呈现你的对象图。它会尝试和序列化非托管正常的POJO,它会尝试创建链接到托管的bean,这是很有必要的。 但是,如果你的领域模型不易读或写成纯JSON,你可能需要配置Jackson的ObjectMapper与自己的自定义类型映射和(反)序列。

抽象类注册

当在领域模型使用抽象类(或接口),一个可能需要挂接到关键的配置点。Jackson默认将不知道什么实现创建一个接口。看看下面的例子:

@EntitypublicclassMyEntity{@OneToManyprivateList<MyInterface> interfaces;}

在默认配置中,Jackson当实例化哪个类,已经不知道什么时候再发布新的数据给出口商。这是你需要告诉Jackson要么通过注解,或者更干净,通过注册使用Module一个类型映射。

要添加自己的Jackson配置由Spring数据REST使用ObjectMapper,覆盖configureJacksonObjectMapper方法。该方法将传递具有特殊的模块来处理序列化和反序列化PersistentEntitys的一个ObjectMapper实例。你也可以注册自己的模块,就像下面的例子。

@Overrideprotectedvoid configureJacksonObjectMapper(ObjectMapper objectMapper){
    objectMapper.registerModule(newSimpleModule("MyCustomModule"){@Overridepublicvoid setupModule(SetupContext context){
            context.addAbstractTypeResolver(newSimpleAbstractTypeResolver().addMapping(MyInterface.class,MyInterfaceImpl.class));}});}

一旦你在Module中有机会获得在SetupContext对象,你可以做各种很酷的事情来配置Jackson的JSON映射。你可以阅读更多有关Modules对杰克逊的维基是如何工作的: http://wiki.fasterxml.com/JacksonFeatureModules

添加自定义序列化的域类型

如果你想用一个特殊的方式(反)序列化域名类型,你可以注册Jackson自己的实现ObjectMapper和Spring Data REST出口将透明地正确地处理这些域对象。要添加序列化,从你的setupModule方法实现,像以下几种做法:

@Overridepublicvoid setupModule(SetupContext context){SimpleSerializers serializers =newSimpleSerializers();SimpleDeserializers deserializers =newSimpleDeserializers();

  serializers.addSerializer(MyEntity.class,newMyEntitySerializer());
  deserializers.addDeserializer(MyEntity.class,newMyEntityDeserializer());

  context.addSerializers(serializers);
  context.addDeserializers(deserializers);}

results matching ""

    No results matching ""