【问题标题】:Spring HATEOAS build link to paged resourceSpring HATEOAS 构建指向分页资源的链接
【发布时间】:2019-01-03 16:29:59
【问题描述】:

我有一个带有方法的控制器,它返回PagedResource,它看起来像这样:

@RequestMapping(value = "search/within", method = RequestMethod.POST)
public @ResponseBody PagedResources within(@RequestBody GeoJsonBody body,
                                           Pageable pageable, PersistentEntityResourceAssembler asm) {

    //  GET PAGE

    return pagedResourcesAssembler.toResource(page, asm);
}

现在,我想将该方法添加为根资源的链接,因此我执行以下操作:

public RepositoryLinksResource process(RepositoryLinksResource repositoryLinksResource) {
    repositoryLinksResource.add(linkTo(methodOn(ShipController.class).within(null, null, null)).withRel("within"));

    return repositoryLinksResource;
}

哪个有效,我得到了我的链接,但是它添加了没有分页参数的链接。所以它看起来像这样:

    "within": {
        "href": "http://127.0.0.1:5000/search/within"
    },

我想把它变成:

    "within": {
        "href": "http://127.0.0.1:5000/search/within{?page, size}"
    },

This 上一个关于 stackoverflow 的问题表明,在修复 corresponding issue on GitHub 后,它应该默认工作,但是它没有。

我做错了什么?

【问题讨论】:

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


    【解决方案1】:

    使用 PagedResourcesAssembler 自动创建分页链接

    我成功使用了PagedResourcesAssembler。假设您的实体被称为 MyEntity。你的within 方法应该返回HttpEntity<PagedResources<MyEntity>>

    您的within 方法应该类似于下面显示的示例。

    @RequestMapping(value = "search/within", method = RequestMethod.POST)
    @ResponseBody 
    public HttpEntity<PagedResources<MyEntity>> 
        within(@RequestBody GeoJsonBody body,Pageable pageable, 
               PagedResourcesAssembler assembler) {
        //  GET PAGE
        Page<MyEntity> page = callToSomeMethod(pageable);
    
        return new ResponseEntity<>(assembler.toResource(page), HttpStatus.OK);
    }
    

    Here 是一个简单的例子。在此示例中,响应如下所示,

    {
        "_embedded": {
        "bookList": [
          {
            "id": "df3372ef-a0a2-4569-982a-78c708d1f609",
            "title": "Tales of Terror",
            "author": "Edgar Allan Poe"
          }
        ]
      },
      "_links": {
        "self": {
          "href": "http://localhost:8080/books?page=0&size=20"
        }
      },
      "page": {
        "size": 20,
        "totalElements": 1,
        "totalPages": 1,
        "number": 0
      }
    }
    

    手动创建分页自链接

    如果您有兴趣手动创建分页链接,这里是您可以使用的代码 sn-p,

    Page<MyEntity> page = callToSomeMethod(pageable);
    
    ControllerLinkBuilder ctrlBldr =
        linkTo(methodOn(ShipController.class).within(body, pageable, asm));
    UriComponentsBuilder builder = ctrlBldr.toUriComponentsBuilder();
    
    int pageNumber = page.getPageable().getPageNumber();
    int pageSize = page.getPageable().getPageSize();
    int maxPageSize = 2000;
    
    builder.replaceQueryParam("page", pageNumber);
    builder.replaceQueryParam("size", pageSize <= maxPageSize ? 
        page.getPageable().getPageSize() : maxPageSize);
    
    Link selfLink =
        new Link(new UriTemplate(builder.build().toString()), "self");
    

    【讨论】:

    • 所以你测试了如果你以这种方式改变返回类型,链接构建器将创建一个以分页参数作为模板参数的链接?
    • @IndraBasak 感谢您的回答。不幸的是,它似乎对我没有帮助。您能否展示您创建该链接的方式?即resource.add(...)调用
    • @IndraBasak 这有点不同。您创建自动自我链接,我想从不同的请求链接到该方法。返回 ResponseEntitiry 仍然没有帮助,生成的链接没有任何参数
    • @IndraBasak 我做到了。没有手动创建链接,只有 PagedResourseAssembler 自动创建。
    • 你成就了我的一天!很难将可分页对象链接为 url。您的构建器 .replaceQueryParam 逻辑有所帮助
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多