生成的 HAL 自身中缺少分页参数 link

Missing paging arguments in generated HAL self link

我正在使用 Spring Boot (2.1.1) 自动创建我的 JpaRepository 接口的 HAL REST API。

大多数情况下这些接口都是空的,例如:

public interface LevelRepository extends JpaRepository<Level, Long> {}

当我打开 REST 基本路径时,会为 levels 生成以下 link:

"levels": {
  "href": "http://localhost:8080/admin/levels{?page,size,sort}",
  "templated": true
} 

当我跟随 http://localhost:8080/admin/levels?size=10 时,我得到了预期的第 0 页及其 10 个元素。 但是给定的自我 link 是:

"self": {
  "href": "http://localhost:8080/admin/levels{&sort}",
  "templated": true
}

我本以为:

我不确定这是错误还是功能?是否有可能获得预期的行为?

我发现了以下关于该主题的问题:Error on generating self link on pageable resource 但是给定的解决方案没有帮助,因为我已经在使用较新的版本。

更多信息(我为什么需要它?)

此行为中断了客户端的后续 link 流程。 如果用户想直接跳转到第X页,或者想改变页面大小,就必须重用原来的link。 不是一个大的解决方法,但它不如模板化和直接跟随给定的自我 link 好。

您可以自己重新实现 self link。首先,我认为你使用 HATEOAS 库:

<dependency>
    <groupId>org.springframework.hateoas</groupId>
    <artifactId>spring-hateoas</artifactId>
</dependency>

让我们考虑一下您的一些实体 - ExampleEntity:

public class ExampleEntity extends ResourceSupport {
    private String id;
    private String name;
    private String surname;

    // standard getters and setters
}

您扩展了 ResourceSupport class,它有 link 属性,我们可以使用 add 方法:

ExampleEntity exampleEntity = new ExampleEntity();
Link selfLink = ControllerLinkBuilder.linkTo(YourController.class).slash(id).withSelfRel();
exampleEntity.add(selfLink);

所以,你可以改变自己的行为link

发布此问题后,我发现以下 Spring JIRA ticket 描述了相同的行为。 根据票证中的评论,self link 不应被模板化。

虽然生成的 self link 是模板化的,但最好忽略给定的参数。