2017-09-18 125 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