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

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

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

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

抽象类注册

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

@Entity
public class MyEntity {

  @OneToMany
  private List<MyInterface> interfaces;
}

在默认配置中,Jackson 不知道在将新数据发布到导出器时要实例化哪个类。你需要通过注释来告诉 Jackson,或者更明确地说,通过使用 Module 注册类型映射。Spring中文文档

在您的范围内申报的任何豆子都由出口商提取并在其 .要添加此特殊的抽象类类型映射,可以创建一个 Bean,并在该方法中添加一个适当的 ,如下所示:ModuleApplicationContextObjectMapperModulesetupModuleTypeResolverSpring中文文档

public class MyCustomModule extends SimpleModule {

  private MyCustomModule() {
    super("MyCustomModule", new Version(1, 0, 0, "SNAPSHOT"));
  }

  @Override
  public void setupModule(SetupContext context) {
    context.addAbstractTypeResolver(
      new SimpleAbstractTypeResolver().addMapping(MyInterface.class,
        MyInterfaceImpl.class));
  }
}

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

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

如果要以特殊方式序列化或反序列化域类型,则可以向 Jackson 的 .然后,Spring Data REST导出器会透明地正确处理这些域对象。ObjectMapperSpring中文文档

若要从方法实现添加序列化程序,可以执行如下操作:setupModuleSpring中文文档

public class MyCustomModule extends SimpleModule {

  …

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

多亏了前面示例中显示的自定义模块,当域对象对于Spring Data REST尝试涵盖的80%通用用例来说过于复杂时,Spring Data REST可以正确处理它们。Spring中文文档