自訂 JSON 輸出

有時在您的應用程式中,您需要從特定實體提供其他資源的連結。例如,Customer 回應可能會豐富包含目前購物車的連結,或管理與該實體相關資源的連結。Spring Data REST 提供與 Spring HATEOAS 的整合,並提供擴充掛鉤,讓您可以變更傳送給用戶端的資源表示法。

RepresentationModelProcessor 介面

Spring HATEOAS 定義了 RepresentationModelProcessor<> 介面來處理實體。所有類型為 RepresentationModelProcessor<EntityModel<T>> 的 bean 都會被 Spring Data REST 匯出器自動選取,並在序列化類型為 T 的實體時觸發。

例如,若要為 Person 實體定義處理器,請將類似以下 (取自 Spring Data REST 測試) 的 @Bean 新增至您的 ApplicationContext

@Bean
public RepresentationModelProcessor<EntityModel<Person>> personProcessor() {

   return new RepresentationModelProcessor<EntityModel<Person>>() {

     @Override
     public EntityModel<Person> process(EntityModel<Person> model) {

      model.add(new Link("https://127.0.0.1:8080/people", "added-link"));
      return model;
     }
   };
}
先前的範例硬式編碼了 localhost:8080/people 的連結。如果您在應用程式中有 Spring MVC 端點要連結,請考慮使用 Spring HATEOAS 的 linkTo(…​) 方法,以避免管理 URL。

您可以透過呼叫 model.add(Link) 將連結新增至實體的預設表示法,如先前的範例所示。您新增至 EntityModel 的任何連結都會新增至最終輸出。

自訂表示法

Spring Data REST 匯出器會在建立輸出表示法之前,執行任何探索到的 RepresentationModelProcessor 實例。它透過向內部 ConversionService 註冊 Converter<Entity, EntityModel> 實例來完成此操作。這是負責建立參照實體連結的元件 (例如物件 JSON 表示法中 _links 屬性下的那些物件)。它會取得 @Entity 並迭代其屬性,為由 Repository 管理的那些屬性建立連結,並複製任何嵌入或簡單屬性。

但是,如果您的專案需要以不同的格式輸出,您可以完全取代預設的傳出 JSON 表示法,使用您自己的表示法。如果您在 ApplicationContext 中註冊您自己的 ConversionService,並註冊您自己的 Converter<Entity, EntityModel>,您可以傳回您選擇的 EntityModel 實作。