向 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 在嚮導出器 POST 新資料時不知道要例項化哪個類。您需要透過註解或更簡潔地透過使用 模組 註冊型別對映來告知 Jackson。
在您的 ApplicationContext 範圍內宣告的任何 Module bean 都將被匯出器獲取並註冊到其 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));
}
}
一旦您在 Module 中訪問了 SetupContext 物件,您就可以執行各種很酷的操作來配置 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 能夠正確處理它們。