向 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 能夠正確處理它們。

© . This site is unofficial and not affiliated with VMware.