2017-09-18 122 views
1

問題:任何HAL客戶端或使用管理員休眠訪問HAL API的示例?HAL客戶端或訪問HAL API的示例

我已經開始了,因爲在介紹的第一段中提到了HAL,但現在我無法找到任何使用HAL休息客戶端的示例或其他人,所以現在我只是寫了一堆簡單的在已經健壯的現有HAL API上查找所有存儲庫。

+0

所有社區REST客戶端已經記錄在案。寫你自己很簡單。我認爲HAL參考只是一個參考。如果你最終寫自己的客戶,然後考慮開源。 –

+0

也許我可以更具體一些,但我不確定的部分是在HAL中它與鏈接到您的實體,而不是將它們放入json響應本身。例如。如果用戶在其中存在帖子,則用戶將不在json的內容部分,它實際上將在單獨的鏈接部分中作爲該帖子的用戶的URL的鏈接。這是一個GET_MANY_REFERENCE嗎?我不確定這是否適合。 – bzzhuh

回答

1

在這裏添加一個更簡潔的答案,我的思維過程沒有受到污染,現在我已經明白了這一點(對於任何人的未來參考)......再次假設HAL API是使用Spring Data Rest創建的。

四大關鍵這種整合是:

  1. 在你的JPA實體,這是在幾個地方使用管理上休息@Column(name="parentEntity", updatable=false, insertable=false) private Integer parentEntityId;
  2. 暴露你的所有實體ID所需的曝光外鍵的屬性RepositoryRestConfiguration.exposeIdsFor(MyEntity.class)
  3. 註釋您的存儲庫爲@RepositoryRestResource並讓它們擴展爲PagingAndSortingRepository<MyEntity, Integer>, QueryDslPredicateExecutor<MyEntity>以通過屬性名稱公開非常有用的搜索過濾器(例如/api/myEntitys?field1=foo&field2=bar)。
  4. 當使用外鍵提交創建和保存請求時,請務必調整您的params.data,以便將暴露的外鍵(例如'http://myserver.com/api/myEntitys/19')包含在(或者HAL沒有用處)附註1.(如myEntityId = 19)

等小件物品:在更新時

使用PATCH而不是PUT(您可以使用PUT,如果你是一個休眠專家和能映射您的實體比我可以更好,但我很難得到它完美映射和HAL的補丁將採取部分實體)

提交GET_LIST和GET_MANY_REFERENCE時,您會從響應的「頁面」部分獲取項目總數和分頁參數,並且在API請求中使用「大小」和「頁面」查詢參數。(所以,不需要標題和內容)

要將任何字符串條目(從上面3.)的默認「等於」過濾器更改爲「包含」過濾器,您還必須擴展QuerydslBinderCustomizer<QMyEntity>並提供您自己的在您的每個存儲庫中定製方法。例如:

default void customize(QuerydslBindings bindings, QChampion champion) { bindings.bind(String.class).first((StringPath path, String value) -> path.contains(value)); }

0

我們沒有任何具體的HAL示例。然而,這個介紹的重點是管理員休息是後端不可知的。

您可以按照documentation創建自己的自定義休息客戶端。閱讀現有的代碼以獲取靈感。

+0

也許我可以更具體一些,但我不確定的部分是在HAL中它與鏈接到您的實體,而不是將它們放入json響應本身。例如。如果用戶在其中存在帖子,則用戶將不在json的內容部分,它實際上將在單獨的鏈接部分中作爲該帖子的用戶的URL的鏈接。這是一個GET_MANY_REFERENCE嗎?我不確定這是否適合。似乎它幾乎就像是一個「GET_ONE_REFERENCE」或其他東西,但這不是一回事。 – bzzhuh

1

對於任何未來引用此內容的人來說,如果您恰好在通過Spring Data Rest控制您的API,則可以考慮在每個現有存儲庫上使用excerptProjection,以顯示實體的內聯版本。如果除了admin-on-rest訪問你的API之外沒有任何東西存在,這將會起作用。

對於我的情況,我打算爲每個具有實體並將其命名爲「內聯」的其他資源編寫自定義投影。然後在rest-on-rest-restClient中,只需要在每個GET_MANY或GET_MANY_REFERENCE請求上詢問內聯投影。

這是我現在最好的。這不是完美的,但對於我擁有的實體數量來說,它比從零開始構建CRUD界面還要快幾周,所以我強烈建議管理員休息。

+0

我在做上述的工作時取得了一些成功,但最終我只是決定遵守許多情況下的管理員休息時間,這是暴露的外鍵。例如。在子實體上做這個@Column(name =「parentEntity」,updatable = false,insertable = false) private Integer parentEntityId; – bzzhuh

+0

此外,不要在您的子實體類中使用「@JsonManagedReference」,因爲您不會獲得發送的父對象,Spring Data也不會知道如何創建實體。不知道後果是什麼,但它的工作。引用孩子時,您仍然必須在父實體中使用「@JsonBackReference」。 – bzzhuh

+0

(當我弄清楚如何讓restClient使用不同於/ api /實體的HAL/api/entity/search時,明天會發布更多內容) – bzzhuh