HAL 客户端或访问 HAL 的示例 API

HAL clients or examples of accessing HAL API

问题:是否有任何 HAL 客户端或使用 admin-on-rest 访问 HAL API 的示例?

我开始是因为在介绍的第一段中提到了 HAL,但现在我找不到任何示例或任何其他使用 HAL rest 客户端的人,所以我现在只写了一堆在已经强大的现有 HAL API.

之上的简单 findAll 存储库

我们没有任何专门针对 HAL 的示例。但是,此介绍的重点是 admin-on-rest 与后端无关。

您可以按照 documentation 创建自己的自定义 rest 客户端。阅读现有的代码以获取灵感。

对于将来引用此内容的任何人,如果您碰巧通过 Spring Data Rest 控制您的 API,您可以考虑在每个现有存储库上使用 excerptProjection显示您的实体的内联版本。如果除了 admin-on-rest 访问您的 API 之外绝对没有任何其他东西,这将起作用。

就我而言,我计划为每个具有实体的其余资源编写一个自定义投影并将其命名为相同的东西:"inline"。然后在 admin-on-rest restClient 中,总是在每个 GET_MANY 或 GET_MANY_REFERENCE 请求中请求内联投影。

这是我目前最好的。它并不完美,但就我拥有的实体数量而言,它仍然比从头开始构建 CRUD 界面快很多周,所以我强烈推荐 admin-on-rest。

在这里添加一个更简洁的答案,现在我已经弄清楚了所有问题(供任何人将来参考),但没有被我的思维过程污染...再次假设 HAL API 已经完成Spring 数据休息。

此集成的四个主要关键是:

  1. 在 JPA 实体中公开外键属性,admin-on-rest @Column(name="parentEntity", updatable=false, insertable=false) private Integer parentEntityId;
  2. 在多个地方要求这样做
  3. 使用 RepositoryRestConfiguration.exposeIdsFor( MyEntity.class )
  4. 公开您的所有实体 ID
  5. 将您的存储库注释为 @RepositoryRestResource 并让它们扩展 PagingAndSortingRepository<MyEntity, Integer>, QueryDslPredicateExecutor<MyEntity> 以通过属性名称(例如 /api/myEntitys?field1=foo&field2=bar)公开非常有用的搜索过滤器。
  6. 当使用外键提交创建和保存请求时,请确保调整您的 params.data 以包含链接资源(例如“http://myserver.com/api/myEntitys/19”)(或代替 HAL)没用)您在 1 中公开的外键。(例如 myEntityId=19)

其他注意事项:

更新时使用 PATCH 而不是 PUT(如果你更像是一个休眠专家并且可以比我更好地映射你的实体,你可以使用 PUT 但我无法完美地映射它并且 HAL 的 PATCH 将需要部分实体)

提交 GET_LIST 和 GET_MANY_REFERENCE 时,您会从响应的 'page' 部分获取项目总数和分页参数,并使用 'size' 和 'page' 在您的 API 请求中查询参数。 (所以,不需要 headers 之类的东西)

要将任何字符串条目(从上面的 3.)的默认 'equals' 过滤器更改为 'contains' 过滤器,您还必须扩展 QuerydslBinderCustomizer<QMyEntity> 并提供您自己的自定义每个存储库中的方法。例如:

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