2016-05-13 103 views
0

春天的Web RestController我們使用PagedResources創建ResponseEntities。 我們有一個RequestMethod,它會在5km半徑內觸發元素的後臺搜索,如果在10km,20km內沒有任何結果,直到找到任何元素。如何擴展PagedResourceAssembler

由於我們現在改變客戶端給定的選項(資源被調用給定的距離),我們想要將改變後的searchDistance返回給客戶端。然後 實際的響應將是這樣的:

{ 
    "_links": { 
    "self": { 
     "href": "http://... 
     "templated": true 
    } 
    }, 
    "_embedded": { 
    "parcelShopResourceList": [ 
     { 
     "_id": "2760183530" 
     ... 
     }, 
     { 
     "_id": "2760128505" 
     ... 
     }, 
     { 
     "_id": "2760162267" 
     ... 
     }, 
     { 
     "_id": "2760196914" 
     ... 
     }, 
     { 
     "_id": "2760147255" 
     ... 
     } 
    ] 
    }, 
    "page": { 
    "size": 200, 
    "totalElements": 5, 
    "totalPages": 1, 
    "number": 0 
    "searchDistance": 10 
    } 
} 

現在的問題:

  • 如何延長PagedResourcesAssembler,所以它會返回任何額外的頁面信息?

我認爲這將是足以創建一個擴展Page,所以PagedResourcesAssembler將額外的信息添加到頁面的信息,但這種情況並非如此。

ResponseEntity.ok(pagedResourcesAssembler.toResource(page, resourceAssembler));

然後我試圖重寫PagedResourcesAssembler本身,而是因爲它使用了大量的私有方法的PagedResourcesAssembler.createResource的覆蓋是不是真的有用。

我想我完全錯過了一些東西。可以請任何人向我解釋如何在我的回覆中添加更多信息?我相信這有一個更簡單的方法。

由於我想添加一個關於整個List的信息,爲了方便,我不想將這些信息插入到單個資源中。

回答

0

確實,一種方法是創建您自己的頁面資源並根據需要自定義您的實體。這包括要呈現的內容和元數據,如搜索距離,大小等。

這裏是個例:

/** 
* 
* Pagination for a resource content 
* 
* @param <T> content to render 
*/ 
public class PagedResource<T> { 
    private List<T> content; 
    private final Map metadata; 
    public PagedResource(Page<T> page, String pageParam, String sizeParam, String sortParam, String sortField) { 
    super(); 
    this.setContent(page.getContent()); 
    this.metadata = new HashMap(); 
    List<Link> links = new ArrayList<Link>(); 
    if (page.hasPrevious()) { 
     String path = createBuilder().queryParam(pageParam, page.getNumber() - 1).queryParam(sizeParam, page.getSize()).queryParam(sortParam, sortField).build().toUriString(); 
     Link previousPageLink = new Link(path, Link.REL_PREVIOUS); 
     links.add(previousPageLink); 
    } 
    if (page.hasNext()) { 
     String path = createBuilder().queryParam(pageParam, page.getNumber() + 1).queryParam(sizeParam, page.getSize()).queryParam(sortParam, sortField).build().toUriString(); 
     Link nextPageLink = new Link(path, Link.REL_NEXT); 
     links.add(nextPageLink); 
    } 
    if (!page.isFirst()) { 
     Link firstPageLink = buildPageLink(pageParam, 0, sizeParam, page.getSize(), sortParam, sortField, Link.REL_FIRST); 
     links.add(firstPageLink); 
    } 
    if (!page.isLast()) { 
     int lastPage = page.getTotalPages() - 1; 
     Link lastPageLink = buildPageLink(pageParam, lastPage, sizeParam, page.getSize(), sortParam, sortField, Link.REL_LAST); 
     links.add(lastPageLink); 
    } 
    Link currentPagelink = buildPageLink(pageParam, page.getNumber(), sizeParam, page.getSize(), sortParam, sortField, Link.REL_SELF); 
    links.add(currentPagelink); 
    populateMetadata(page, links); 
    } 
    private void populateMetadata(Page<T> page, List<Link> links) { 
    int per_page = page.getSize(); 
    int totalPages = page.getTotalPages(); 
    int numberOfPageElements = page.getNumberOfElements(); 
    metadata.put("numberOfPageElements", numberOfPageElements); 
    metadata.put("perPage", per_page); 
    metadata.put("totalPages", totalPages); 
    metadata.put("links", links); 
    } 
    private Link buildPageLink(String pageParam, int page, String sizeParam, int size, String sortParam, String sortAttribute, String rel) { 
    String path = createBuilder().queryParam(pageParam, page).queryParam(sizeParam, size).queryParam(sortParam, sortAttribute).toUriString(); 
    Link link = new Link(path, rel); 
    return link; 
    } 
    private ServletUriComponentsBuilder createBuilder() { 
    return ServletUriComponentsBuilder.fromCurrentRequestUri(); 
    } 
    public List<T> getContent() { 
    return content; 
    } 
    public void setContent(List<T> content) { 
    this.content = content; 
    } 
    public Map getMetadata() { 
    return metadata; 
    } 
} 

您可以在下面找到如何使用自定義分頁資源完整example

0

感謝哈薩姆的例子,但我或多或少的約束現有的仇恨反應結構!

我實際上解決了這個問題,在RestController中創建一個包裝器,它創建一個新的Response並在PagedResourcesAssembler創建的響應周圍添加所需的信息。