跳到主要内容

领域对象表示(对象映射)

DeepSeek V3 中英对照 Representations Domain Object Representations (Object Mapping)

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

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

要将您自己的 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));
}
});
}
java

一旦你在 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);
}
java