Spring 引导 (HATEOAS) ControllerLinkBuilder.linkTo(...) 查询参数 missing/not 已创建

Spring Boot (HATEOAS) ControllerLinkBuilder.linkTo(...) query parameter missing/not created

我正在使用 Spring Boot (1.4) 开发 REST API,并且还使用 PagedResourcesAssembler 创建 JSON 分页响应,这非常有效。来自 Spring 的小伙伴们做得很好! 但是,我在提供 URL 查询参数(如果提供)时遇到问题。我知道 PagedResourcesAssembler 无法自己找出 URL 查询参数,所以我想为它提供一个 Link,使用 ControllerLinkBuilder.linkTo(controller, parameters) 方法:

@RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public HttpEntity<PagedResources<Document>> find(final DocumentSearch searchForm, final Pageable pageable, final PagedResourcesAssembler assembler) {

    final Page<Document> documents = documentService.find(searchForm, pageable);

    // this map is just for this example ..
    final Map<String, Object> parameters = new HashMap<>();
    parameters.put("text", "foobar");

    final Link link = ControllerLinkBuilder.linkTo(DocumentController.class, parameters).withSelfRel();

    return ResponseEntity.ok(assembler.toResource(documents, link));
}

如您所见,我明确地为 link 提供了一个参数,但相应的响应中没有 URL 查询:

    {
    "_links": {
        "first": {
            "href": "http://localhost:8080/documents?page=0&size=20"
        },
        "self": {
            "href": "http://localhost:8080/documents"
        },
        "next": {
            "href": "http://localhost:8080/documents?page=1&size=20"
        },
        "last": {
            "href": "http://localhost:8080/documents?page=2&size=20"
        }
    }

我也试过调试,他在打电话:

linkTo:123, ControllerLinkBuilder (org.springframework.hateoas.mvc)
展开:152,UriComponents (org.springframework.web.util)
expandInternal:47,HierarchicalUriComponents (org.springframework.web.util)
expandInternal:330,HierarchicalUriComponents (org.springframework.web.util)

expandInternal:340,HierarchicalUriComponents (org.springframework.web.util) 直到此时他还有我的 text=foobar,同时作为 QueryUriTemplateVariable 但然后在

expandInternal:341,HierarchicalUriComponents (org.springframework.web.util) 他不会进入他 would/could 将我的 text=foobar 放入他的结果映射的 for 循环

非常感谢任何帮助。

此致, 彼得

更新

为了完成这项工作,我必须做两件事。首先,更改方法签名并添加 @RequestParam 以及我希望在分页 link 中作为参数的相应参数,其次,使用 methodOn 来自 控制器Link建造者:

public HttpEntity<PagedResources<Document>> find(@RequestParam(value = "text", required = false) final String text, final Pageable pageable, final PagedResourcesAssembler assembler) {

final Link link = ControllerLinkBuilder.linkTo(
            ControllerLinkBuilder.methodOn(
                    DocumentController.class).find(text, pageable, assembler)).withSelfRel();

非常感谢你们的帮助,干杯。

P.s。有什么方法可以在没有 methodOn 的情况下完成这项工作吗?

根据@RequestMapping生成链接。您传递的参数仅用于替换指定URL中的变量。它们不是添加的查询参数。你需要自己做。