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中的变量。它们不是添加的查询参数。你需要自己做。
我正在使用 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中的变量。它们不是添加的查询参数。你需要自己做。