制作一个简单的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,而只需使用精确的参数页面和大小即可。但是,我希望有一些可分页的解决方案

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

最佳答案

我认为,自我链接应为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());

09-26 11:06