此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Data REST 4.5.3! |
将自定义序列化器和反序列化器添加到 Jackson 的ObjectMapper
有时,Spring Data REST 的行为ObjectMapper
(已专门配置为使用可以将域对象转换为链接并返回的智能序列化程序)可能无法正确处理您的域模型。您可以通过多种方式构建数据,以至于您可能会发现自己的域模型无法正确转换为 JSON。在这些情况下,以通用方式支持复杂的领域模型有时也是不切实际的。有时,根据复杂性,甚至不可能提供通用解决方案。
为了适应最大比例的用例,Spring Data REST 会尝试正确呈现对象图。它尝试将非托管 Bean 序列化为普通 POJO,并在必要时尝试创建指向托管 Bean 的链接。但是,如果您的域模型不容易适合读取或写入纯 JSON,您可能需要配置 Jackson 的ObjectMapper
使用您自己的自定义类型映射和 (反)序列化程序。
抽象类注册
您可能需要挂钩的一个关键配置点是在域模型中使用抽象类(或接口)时。默认情况下,Jackson 不知道要为接口创建什么实现。请考虑以下示例:
@Entity
public class MyEntity {
@OneToMany
private List<MyInterface> interfaces;
}
在默认配置中,Jackson 不知道在将新数据发布到导出器时要实例化哪个类。你需要通过注释来告诉 Jackson,或者更干净地说,通过使用 Module 注册类型映射。
任何Module
bean 在ApplicationContext
由出口商提货并在其注册ObjectMapper
.要添加此特殊的抽象类类型映射,您可以创建一个Module
bean 和setupModule
方法,添加适当的TypeResolver
如下:
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));
}
}
一旦您有权访问SetupContext
对象Module
,您可以做各种很酷的事情来配置 Jackon 的 JSON 映射。您可以在 Jackson 的 wiki 上阅读有关模块如何工作的更多信息。
为域类型添加自定义序列化程序
如果您想以特殊方式序列化或反序列化域类型,您可以使用 Jackson 的ObjectMapper
.然后,Spring Data REST 导出器会透明地正确处理这些域对象。
要从setupModule
方法实现时,您可以执行如下作:
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 可以正确处理它们。