定製 JSON 輸出

在應用程式中,有時需要從特定實體提供指向其他資源的連結。例如,一個 Customer 響應可以包含指向當前購物車或管理該實體相關資源的連結。Spring Data REST 集成了 Spring HATEOAS 並提供了一個擴充套件點,允許您修改傳送給客戶端的資源的表現形式。

RepresentationModelProcessor 介面

Spring HATEOAS 定義了一個用於處理實體的 RepresentationModelProcessor<> 介面。所有型別為 RepresentationModelProcessor<EntityModel<T>> 的 Bean 會被 Spring Data REST exporter 自動檢測到,並在序列化型別為 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://:8080/people", "added-link"));
      return model;
     }
   };
}
前面的示例硬編碼了一個指向 localhost:8080/people 的連結。如果您的應用程式中有一個您希望連結到的 Spring MVC 端點,請考慮使用 Spring HATEOAS 的 linkTo(…​) 方法來避免手動管理 URL。

您可以透過呼叫 model.add(Link) 將連結新增到實體的預設表現形式中,如前面的示例所示。您新增到 EntityModel 的任何連結都會被新增到最終輸出中。

定製表現形式

Spring Data REST exporter 在建立輸出表現形式之前會執行所有發現的 RepresentationModelProcessor 例項。它透過向內部 ConversionService 註冊一個 Converter<Entity, EntityModel> 例項來實現這一點。這是負責建立指向引用實體連結的元件(例如物件 JSON 表現形式中 _links 屬性下的物件)。它接受一個 @Entity,並遍歷其屬性,為由 Repository 管理的屬性建立連結,並複製任何嵌入式或簡單屬性。

但是,如果您的專案需要以不同的格式輸出,則可以完全用您自己的實現替換預設的 JSON 輸出表現形式。如果您在 ApplicationContext 中註冊自己的 ConversionService 並註冊自己的 Converter<Entity, EntityModel>,則可以返回您選擇的 EntityModel 實現。