2017-05-25 92 views
1

做一个简单的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&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&page=2&size=10

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

我已经看到,如果spring-data-rest self有一个模板类型。但我想得到我所要求的网址

回答

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