一尘不染

Spring Boot(HATEOAS)ControllerLinkBuilder.linkTo(…)查询参数丢失/未创建

spring-boot

我正在使用带有Spring Boot(1.4)的REST
API,还使用PagedResourcesAssembler来创建带有分页的JSON响应,这就像一个魅力。Spring的家伙做得很好!但是,在提供URL查询参数(如果提供)时遇到了问题。我知道PagedResourcesAssembler不能自行确定URL查询参数,因此我想使用ControllerLinkBuilder.linkTo(controller,parameters)方法为其提供一个Link:

@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));
}

如您所见,我为链接提供了一个参数,但是相应的响应中没有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)
他没有进入for循环,他会/可能将我的text = foobar放入他的结果图中

很感谢任何形式的帮助。

最好的问候,彼得

更新

为了使这项工作,我必须做两件事。首先,更改方法签名,并添加@RequestParam与相应的参数我想有作为分页链接参数和第二,使用 methodOn
ControllerLinkBuilder

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

非常感谢你们的帮助,欢呼。

PS有没有方法可以使这项工作没有methodOn吗?


阅读 604

收藏
2020-05-30

共1个答案

一尘不染

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

2020-05-30