0

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

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

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

当我打开我的 REST 基本路径时,会生成以下链接levels

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

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

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

我本来期望:

  • http://localhost:8080/admin/levels{?page,size,sort}或者
  • http://localhost:8080/admin/levels?page=0&size=10{&sort}

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

我发现了有关该主题的以下问题:在可分页资源上生成自我链接时出错 但是给定的解决方案没有帮助,因为我已经在使用较新的版本。

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

此行为会中断客户端上的后续链接流。如果用户想直接跳转到页面 X 或者他想改变页面大小,则必须重用原来的链接。不是一个很大的解决方法,但它不如模板和直接遵循给定的自我链接那么好。

4

2 回答 2

1

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

尽管生成的自链接是模板化的,但最好忽略给定的参数。

于 2019-01-09T13:07:25.363 回答
0

您可以自己重新实现self链接。首先,我认为您使用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该类,它具有link我们可以使用add方法使用的属性:

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

所以,你可以改变你的自我链接的行为

于 2019-01-09T11:26:01.733 回答