域对象表示(对象映射)
Spring Data REST 返回与 HTTP 请求中指定的 Accept 类型对应的领域对象表示。
目前,仅支持 JSON 表示。将来可以通过添加适当的转换器并使用适当的 content-type 更新控制器方法来支持其他表示类型。
有时,Spring Data REST 的 ObjectMapper(已特别配置为使用智能序列化器,可以将领域对象转换为链接并再次转换回来)的行为可能无法正确处理您的领域模型。您可以构造数据的方式有很多种,您可能会发现您的领域模型未能正确转换为 JSON。在这些情况下,尝试以通用方式支持复杂的领域模型有时也不切实际。有时,根据复杂程度,甚至不可能提供通用解决方案。
向 Jackson 的 ObjectMapper 添加自定义序列化器和反序列化器
为了适应最大比例的用例,Spring Data REST 非常努力地正确渲染您的对象图。它尝试将非托管 bean 序列化为普通的 POJO,并在必要时尝试创建指向托管 bean 的链接。但是,如果您的领域模型不方便读写纯 JSON,您可能希望使用您自己的自定义映射、序列化器和反序列化器来配置 Jackson 的 ObjectMapper。
抽象类注册
您可能需要关注的一个关键配置点是当您在领域模型中使用抽象类(或接口)时。默认情况下,Jackson 不知道为接口创建什么实现。考虑以下示例:
@Entity
public class MyEntity {
@OneToMany
private List<MyInterface> interfaces;
}
在默认配置中,当向导出器 POST 新数据时,Jackson 不知道要实例化哪个类。您需要通过注解或(更简洁地)通过使用 Module 注册类型映射来告诉 Jackson 这一点。
要将您自己的 Jackson 配置添加到 Spring Data REST 使用的 ObjectMapper 中,请覆盖 configureJacksonObjectMapper 方法。该方法传递一个 MapperBuilder 实例,该实例具有一个特殊模块来处理 PersistentEntity 对象的序列化和反序列化。您也可以注册自己的模块,如下例所示:
@Override
public void configureJacksonObjectMapper(MapperBuilder<? extends ObjectMapper, ? extends MapperBuilder<?, ?>> mapperBuilder) {
mapperBuilder.addModule(new SimpleModule("MyCustomModule") {
@Override
public void setupModule(SetupContext context) {
context.addAbstractTypeResolver(
new SimpleAbstractTypeResolver()
.addMapping(MyInterface.class, MyInterfaceImpl.class));
}
});
}
一旦您在 Module 中访问了 SetupContext 对象,您就可以做各种很酷的事情来配置 Jackson 的 JSON 映射。您可以在 Jackson 的 wiki 上阅读更多关于 Module 实例如何工作的信息。
为领域类型添加自定义序列化器
如果您想以特殊方式序列化或反序列化领域类型,您可以向 Jackson 的 ObjectMapper 注册您自己的实现,Spring Data REST 导出器会透明地正确处理这些领域对象。要从您的 setupModule 方法实现中添加序列化器,您可以执行以下操作:
@Override
public void setupModule(SetupContext context) {
SimpleSerializers serializers = new SimpleSerializers();
SimpleDeserializers deserializers = new SimpleDeserializers();
serializers.addSerializer(MyEntity.class, new MyEntitySerializer());
deserializers.addDeserializer(MyEntity.class, new MyEntityDeserializer());
context.addSerializers(serializers);
context.addDeserializers(deserializers);
}