2016-05-13 102 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创建的响应周围添加所需的信息。