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

问题描述 投票:4回答:2

制作一个简单的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有一种模板。但我想得到我要求的网址

spring spring-data-rest hateoas spring-rest spring-hateoas
2个回答
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));

(Qazxswpoi)

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

source

resources.add(createLink(base, null, Link.REL_SELF)); 方法永远不会通过所需的createLink,但Pageable作为第二个参数。

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

null

0
投票

根据Oliver的评论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()); ,自我链接不应包含模板信息,这不是一个错误。

© www.soinside.com 2019 - 2024. All rights reserved.