生成的HAL自链接中缺少分页参数

时间:2019-01-09 10:38:41

标签: spring spring-boot spring-data-rest spring-hateoas hal-json

我正在使用Spring Boot(2.1.1)自动创建--- hosts: localhost tasks: - name: Creating s3Bucket s3_bucket: name: ansiblebucket1234567890 tags: - createbucket - name: Simple PUT operation aws_s3: bucket: ansiblebucket1234567890 object: /my/desired/key.txt src: /etc/ansible/myfile.txt mode: put tags: - putfile - name: Create an empty bucket aws_s3: bucket: ansiblebucket12345678901234 mode: create permission: private tags: - emptybucket 接口的HAL REST API。

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

ansible-playbook creates3bucket.yml --tags "createbucket,putfile"

当我打开REST基本路径时,将为JpaRepository生成以下链接:

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

当我遵循levels时,将得到预期的第0页及其10个元素。 但是给定的自我链接是:

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

我原本期望:

  • http://localhost:8080/admin/levels?size=10
  • "self": { "href": "http://localhost:8080/admin/levels{&sort}", "templated": true }

我不确定这是错误还是功能?可以得到预期的行为吗?

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

其他信息(为什么需要它?)

此行为中断了客户端上以下链接的流程。 如果用户想直接跳到页面X,或者想要改变页面大小,则必须重新使用原始链接。 这不是一个大的解决方法,但是它不像模板和直接跟踪给定的自我链接那样好。

2 个答案:

答案 0 :(得分: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);

因此,您可以更改自我链接的行为

答案 1 :(得分:0)

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

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