2017-05-25 47 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());