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
方法。该方法将传递具有特殊的模块来处理序列化和反序列化PersistentEntity
s的一个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映射。你可以阅读更多有关Module
s对杰克逊的维基是如何工作的: 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);}