对于最新的稳定版本,请使用 Spring Data REST 4.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Data REST 4.3.1Spring中文文档

Spring Data REST返回与HTTP请求中指定的类型相对应的域对象的表示形式。AcceptSpring中文文档

目前,仅支持 JSON 表示形式。通过添加适当的转换器并使用适当的内容类型更新控制器方法,将来可以支持其他表示类型。Spring中文文档

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

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

为了适应最大比例的用例,Spring Data REST会非常努力地正确呈现对象图。它尝试将非托管 Bean 序列化为普通 POJO,并尝试在必要时创建指向托管 Bean 的链接。但是,如果你的领域模型不容易读取或写入纯 JSON,你可能希望使用你自己的自定义映射、序列化程序和反序列化程序来配置 Jackson 的 ObjectMapper。Spring中文文档

抽象类注册

您可能需要挂钩的一个关键配置点是在领域模型中使用抽象类(或接口)时。默认情况下,Jackson 不知道要为接口创建什么实现。请看以下示例:Spring中文文档

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

在默认配置中,Jackson 不知道在将新数据发布到导出器时要实例化哪个类。这是您需要通过注解或(更干净地)通过使用 .ModuleSpring中文文档

若要将自己的 Jackson 配置添加到 Spring Data REST 使用的配置中,请重写该方法。该方法传递一个实例,该实例具有一个特殊模块,用于处理序列化和反序列化对象。您也可以注册自己的模块,如以下示例所示:ObjectMapperconfigureJacksonObjectMapperObjectMapperPersistentEntitySpring中文文档

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

一旦你可以访问 中的对象,你就可以做各种很酷的事情来配置 Jackson 的 JSON 映射。您可以在 Jackson 的 wiki 上阅读有关实例如何工作的更多信息。SetupContextModuleModuleSpring中文文档

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

如果要以特殊方式序列化或反序列化域类型,则可以使用 Jackson 的 注册自己的实现,Spring Data REST 导出器会透明地正确处理这些域对象。若要从方法实现添加序列化程序,可以执行如下操作:ObjectMappersetupModuleSpring中文文档

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