域物件表示(物件對映)
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;
}
在預設配置中,當嚮導出器 POST 新資料時,Jackson 不知道要例項化哪個類。您需要透過註解或(更簡潔地)透過使用 Module 註冊型別對映來告訴 Jackson 這一點。
要將您自己的 Jackson 配置新增到 Spring Data REST 使用的 ObjectMapper 中,請覆蓋 configureJacksonObjectMapper 方法。該方法傳遞一個 MapperBuilder 例項,該例項具有一個特殊模組來處理 PersistentEntity 物件的序列化和反序列化。您也可以註冊自己的模組,如下例所示:
@Override
public void configureJacksonObjectMapper(MapperBuilder<? extends ObjectMapper, ? extends MapperBuilder<?, ?>> mapperBuilder) {
mapperBuilder.addModule(new SimpleModule("MyCustomModule") {
@Override
public void setupModule(SetupContext context) {
context.addAbstractTypeResolver(
new SimpleAbstractTypeResolver()
.addMapping(MyInterface.class, MyInterfaceImpl.class));
}
});
}
一旦您在 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);
}