对于最新的稳定版本,请使用 Spring Data REST 4.4.0spring-doc.cadn.net.cn

域对象表示 (Object Mapping)

Spring Data REST 返回对应于Accepttype 中指定的 HTTP 请求。spring-doc.cadn.net.cn

目前,仅支持 JSON 表示形式。将来可以通过添加适当的转换器并使用适当的 content-type 更新控制器方法来支持其他表示类型。spring-doc.cadn.net.cn

有时,Spring Data REST 的行为ObjectMapper(已专门配置为使用智能序列化器,可以将域对象转换为链接并再次返回)可能无法正确处理您的域模型。构建数据的方法有很多,您可能会发现自己的域模型没有正确转换为 JSON。在这些情况下,尝试以通用方式支持复杂的域模型有时也是不切实际的。有时,根据复杂性,甚至无法提供通用解决方案。spring-doc.cadn.net.cn

向 Jackson 的 ObjectMapper 添加自定义序列化器和反序列化器

为了容纳最大比例的用例,Spring Data REST 会非常努力地正确呈现对象图。它尝试将非托管 bean 序列化为普通 POJO,并在必要时尝试创建指向托管 bean 的链接。但是,如果您的域模型不容易读取或写入纯 JSON,则可能需要使用自己的自定义映射、序列化器和反序列化器配置 Jackson 的 ObjectMapper。spring-doc.cadn.net.cn

抽象类注册

您可能需要挂接的一个关键配置点是当您在域模型中使用抽象类(或接口)时。默认情况下,Jackson 不知道要为 interface 创建什么 implementation。请考虑以下示例:spring-doc.cadn.net.cn

@Entity
public class MyEntity {
  @OneToMany
  private List<MyInterface> interfaces;
}

在默认配置中,Jackson 不知道在 POST 新数据到导出器时要实例化哪个类。这是您需要通过注释告诉 Jackson 的内容,或者(更清楚地)通过使用Module.spring-doc.cadn.net.cn

要将您自己的 Jackson 配置添加到ObjectMapper由 Spring Data REST 使用,请覆盖configureJacksonObjectMapper方法。该方法将ObjectMapper具有特殊模块来处理序列化和反序列化的实例PersistentEntity对象。您也可以注册自己的模块,如下例所示:spring-doc.cadn.net.cn

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

一旦您可以访问SetupContextobject 添加到Module,您可以做各种很酷的事情来配置 Jackson 的 JSON 映射。您可以阅读更多关于如何作Module实例在 Jackson 的 wiki 上有效。spring-doc.cadn.net.cn

为域类型添加自定义序列化程序

如果你想以特殊方式序列化或反序列化一个域类型,你可以用 Jackson 的ObjectMapper,并且 Spring Data REST 导出器以透明方式正确处理这些域对象。要从setupModule方法实现,您可以执行如下作:spring-doc.cadn.net.cn

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