在可分页资源上生成自链接时出错

时间:2017-05-25 08:13:08

标签: spring spring-data-rest hateoas spring-rest spring-hateoas

制作一个简单的RestController

@RestController
public class Controloler
    @Value
    class MyData {
        int value;
    }

    @GetMapping(value = "/datas", produces = MediaTypes.HAL_JSON_VALUE)
    public PagedResources<Resource<MyData>> getMyData(PagedResourcesAssembler<MyData> assembler,
                                                              @RequestParam(required = false) String param,
                                                              @PageableDefault Pageable pageRequest)
    {
        MyData data = new MyData(1);
        Page<MyData> page = new PageImpl<>(Collections.singletonList(data), pageRequest, 100);
        Link selfLink = linkTo(methodOn(Controloler.class).getMyData(assembler, param, pageRequest)).withSelfRel();
        return assembler.toResource(page, selfLink);
    }

}

当我尝试让页面curl "http://localhost:8080/datas?param=12&page=2"出现自我链接生成问题时

{
  "_embedded": {
    "myDataList": [
      {
        "value": 1
      }
    ]
  },
  "_links": {
    "first": {
      "href": "http://localhost:8080/datas?param=12&page=0&size=10"
    },
    "prev": {
      "href": "http://localhost:8080/datas?param=12&page=1&size=10"
    },
    "self": {
      "href": "http://localhost:8080/datas?param=12"
    },
    "next": {
      "href": "http://localhost:8080/datas?param=12&page=3&size=10"
    },
    "last": {
      "href": "http://localhost:8080/datas?param=12&page=9&size=10"
    }
  },
  "page": {
    "size": 10,
    "totalElements": 100,
    "totalPages": 10,
    "number": 2
  }
}

在我看来,自我链接应该是http://localhost:8080/datas?param=12&page=2&size=10

刚才我可以解决这个问题而不在参数中使用pageable,只需要精确的params页面和大小。但是,我希望有一些可分页的解决方案

我已经看到,在spring-data-rest的情况下,self有一种模板。但我想得到我要求的网址

2 个答案:

答案 0 :(得分:2)

  

在我看来,自我链接应该是http://localhost:8080/datas?param=12&page=2&size=10

我同意。事实上,它似乎是一个错误。 PagedResourcesAssembler的最新版本采用了不同的方式:

Link selfLink = link.map(it -> it.withSelfRel())//
                .orElseGet(() -> createLink(base, page.getPageable(), Link.REL_SELF));

source

该类的Buggy版本正在执行此操作:

resources.add(createLink(base, null, Link.REL_SELF));

createLink方法永远不会传递所需的Pageable,但会传递null作为第二个参数。

因此,如果您无法升级到最新版本,您仍然可以解决它:

Link selfLink = linkTo(methodOn(Controloler.class).getMyData(assembler, param, pageRequest)).withSelfRel();
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(selfLink.expand().getHref());
new HateoasPageableHandlerMethodArgumentResolver().enhance(builder, null, pageRequest);
Link newSelfLink = new Link(builder.build().toString());

答案 1 :(得分:0)

根据奥利弗(Oliver)的评论in an issue opened to address this,自我链接不应包含模板信息,这也不是错误。