域对象表示(对象映射)

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;
}

在默认配置中,Jackson 不知道在将新数据 POST 到导出器时要实例化哪个类。您需要通过注释或(更简洁地)通过使用 `Module` 注册类型映射来告诉 Jackson。

要将您自己的 Jackson 配置添加到 Spring Data REST 使用的 `ObjectMapper`,请覆盖 `configureJacksonObjectMapper` 方法。该方法传递了一个 `ObjectMapper` 实例,该实例具有一个特殊模块来处理 `PersistentEntity` 对象的序列化和反序列化。您也可以注册自己的模块,如下面的示例所示

@Override
protected void configureJacksonObjectMapper(ObjectMapper objectMapper) {

  objectMapper.registerModule(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);
}