【问题标题】:Error on generating self link on pageable resource在可分页资源上生成自我链接时出错
【发布时间】:2017-10-25 19:29:34
【问题描述】:

制作一个简单的 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&amp;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&amp;page=2&amp;size=10

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

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

【问题讨论】:

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


    【解决方案1】:

    在我看来,自我链接应该是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)

    该类的越野车版本正在这样做:

    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());
    

    【讨论】:

      【解决方案2】:

      根据 Oliver 的评论in an issue opened to address this,self 链接不应包含模板信息,这不是错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-17
        • 2017-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-23
        相关资源
        最近更新 更多