配置 REST URL 路徑

您可以配置 JPA 儲存庫資源匯出的 URL 路徑段。為此,在類級別或查詢方法級別添加註解。

預設情況下,匯出器使用領域類的名稱公開您的 CrudRepository。Spring Data REST 還會應用 Evo Inflector 將該詞複數化。請看以下儲存庫定義

interface PersonRepository extends CrudRepository<Person, Long> {}

上述示例定義的儲存庫在 localhost:8080/persons/ 上公開。

要更改儲存庫的匯出方式,請在類級別新增 @RestResource 註解,如下例所示

@RepositoryRestResource(path = "people")
interface PersonRepository extends CrudRepository<Person, Long> {}

上述示例定義的儲存庫可透過 localhost:8080/people/ 訪問。

如果您定義了查詢方法,它們也預設透過其名稱公開,如下例所示

interface PersonRepository extends CrudRepository<Person, Long> {

  List<Person> findByName(String name);
}

上述示例中的方法在 localhost:8080/persons/search/findByName 上公開。

所有查詢方法資源都在 search 資源下公開。

要更改此查詢方法公開的 URL 段,您可以再次使用 @RestResource 註解,如下例所示

@RepositoryRestResource(path = "people")
interface PersonRepository extends CrudRepository<Person, Long> {

  @RestResource(path = "names")
  List<Person> findByName(String name);
}

現在,上述示例中的查詢方法在 localhost:8080/people/search/names 上公開。

處理 rel 屬性

由於這些資源都是可發現的,您還可以影響匯出器傳送的連結中 rel 屬性的顯示方式。

例如,在預設配置中,如果您向 localhost:8080/persons/search 傳送請求以找出公開了哪些查詢方法,您會得到一個類似的連結列表

{
  "_links" : {
    "findByName" : {
      "href" : "https://:8080/persons/search/findByName"
    }
  }
}

要更改 rel 值,請使用 @RestResource 註解上的 rel 屬性,如下例所示

@RepositoryRestResource(path = "people")
interface PersonRepository extends CrudRepository<Person, Long> {

  @RestResource(path = "names", rel = "names")
  List<Person> findByName(String name);
}

上述示例會產生以下連結值

{
  "_links" : {
    "names" : {
      "href" : "https://:8080/persons/search/names"
    }
  }
}
這些 JSON 片段假設您使用 Spring Data REST 的預設 HAL 格式。您可以關閉 HAL,這將導致輸出看起來不同。但是,您覆蓋 rel 名稱的能力完全獨立於渲染格式。

您可以更改儲存庫的 rel,如下例所示

@RepositoryRestResource(path = "people", rel = "people")
interface PersonRepository extends CrudRepository<Person, Long> {

  @RestResource(path = "names", rel = "names")
  List<Person> findByName(String name);
}

更改儲存庫的 rel 會更改頂級名稱,如下例輸出所示

{
  "_links" : {
    "people" : {
      "href" : "https://:8080/people"
    },
    …
  }
}

在上述輸出所示的頂級片段中

  • path = "people"href 中的值從 /persons 更改為 /people

  • rel = "people" 將該連結的名稱從 persons 更改為 people

當您導航到此儲存庫的 search 資源時,查詢方法的 @RestResource 註解已更改了路徑,如下所示

{
  "_links" : {
    "names" : {
      "href" : "https://:8080/people/search/names"
    }
  }
}

儲存庫定義中的這組註解導致了以下更改

  • 儲存庫級別註解的 path = "people" 反映在帶有 /people 的基本 URI 中。

  • 包含查詢方法為您提供了 /people/search

  • path = "names" 建立了 /people/search/names 的 URI。

  • rel = "names" 將該連結的名稱從 findByNames 更改為 names

隱藏某些儲存庫、查詢方法或欄位

您可能不希望某些儲存庫、儲存庫上的查詢方法或實體欄位被匯出。示例包括隱藏 User 物件上的 password 等欄位和類似敏感資料。要告訴匯出器不匯出這些專案,請使用 @RestResource 對其進行註解並設定 exported = false

例如,要跳過匯出儲存庫,您可以建立一個類似於以下示例的儲存庫定義

@RepositoryRestResource(exported = false)
interface PersonRepository extends CrudRepository<Person, Long> {}

要跳過匯出查詢方法,您可以對查詢方法使用 @RestResource(exported = false) 進行註解,如下所示

@RepositoryRestResource(path = "people", rel = "people")
interface PersonRepository extends CrudRepository<Person, Long> {

  @RestResource(exported = false)
  List<Person> findByName(String name);
}

同樣,要跳過匯出欄位,您可以對欄位使用 @RestResource(exported = false) 進行註解,如下所示

@Entity
public class Person {

  @Id @GeneratedValue private Long id;

  @OneToMany
  @RestResource(exported = false)
  private Map<String, Profile> profiles;
}
投影提供了更改匯出內容並有效繞過這些設定的方法。如果您針對同一領域物件建立任何投影,請務必不要匯出欄位。

隱藏儲存庫 CRUD 方法

如果您不想在 CrudRepository 上公開儲存或刪除方法,您可以透過重寫要關閉的方法並將註解放在重寫版本上來使用 @RestResource(exported = false) 設定。例如,為了防止 HTTP 使用者呼叫 CrudRepository 的刪除方法,請重寫所有這些方法並將註解新增到重寫方法中,如下所示

@RepositoryRestResource(path = "people", rel = "people")
interface PersonRepository extends CrudRepository<Person, Long> {

  @Override
  @RestResource(exported = false)
  void delete(Long id);

  @Override
  @RestResource(exported = false)
  void delete(Person entity);
}
重要的是您要重寫兩個 delete 方法。為了提高執行時效能,匯出器目前使用一種有些幼稚的演算法來確定要使用哪個 CRUD 方法。您目前無法關閉接受 ID 的 delete 版本,但可以匯出接受實體例項的版本。暫時,您可以選擇匯出或不匯出 delete 方法。如果您想關閉它們,請記住必須使用 exported = false 註解這兩個版本。
© . This site is unofficial and not affiliated with VMware.