5

次のコントローラーメソッドがあります。

@RequestMapping(method = GET, produces = APPLICATION_JSON_VALUE)
@Transactional(readOnly = true)
public ResponseEntity list(Pageable pageable, PagedResourcesAssembler pagedResourcesAssembler) {
    Page<Customer> customers = customerRepository.findAll(pageable);
    return ResponseEntity.ok().body(pagedResourcesAssembler.toResource(customers, customerResourceAssembler));
}

@RequestMapping(value = "/search", method = GET, produces = APPLICATION_JSON_VALUE)
@Transactional(readOnly = true)
public ResponseEntity search(@RequestParam("q") String q, Pageable pageable, PagedResourcesAssembler pagedResourcesAssembler) {
    Specification spec = where(..some specs..);
    Page<Customer> customers = customerRepository.findAll(spec, pageable);
    return ResponseEntity.ok().body(pagedResourcesAssembler.toResource(customers, customerResourceAssembler));
}

最初のメソッドは、すべての顧客リソースをページとして返します。

2 番目のものもページ化された結果を返しますが、qフィルターするクエリ パラメーターを提供するオプションがあります。

検索メソッドからの JSON HATEOAS 応答には、次のような次のページへのリンクが含まれています。

{
     "rel": "next",
     "href": "http://localhost:8080/api/customers/search?page=1&size=10{&sort}"
}

問題は、ここでqクエリ パラメータが失われることです。

ここで を別の方法で使用する必要がPagedResourcesAssemblerありますか?

4

1 に答える 1

8

手動でリンクを作成することで解決策を見つけたと思います。以下の例を参照してください。

@RequestMapping(value = "/search", method = GET, produces = APPLICATION_JSON_VALUE)
@Transactional(readOnly = true)
public ResponseEntity search(@RequestParam("q") String q, Pageable pageable, PagedResourcesAssembler pagedResourcesAssembler) {

    // create link to search method with q; pass link as 3th param to paged resource assembler's toResource method
    Link link = linkTo(methodOn(CustomerController.class).search(q, pageable, pagedResourcesAssembler)).withSelfRel();

    Specification spec = where(..some specs..);
    Page<Customer> customers = customerRepository.findAll(spec, pageable);
    return ResponseEntity.ok().body(pagedResourcesAssembler.toResource(customers, customerResourceAssembler, link));
}
于 2014-11-14T18:55:59.457 に答える