配置 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 註解這兩個版本。 |