0

最新の Spring REST と HATEOAS を使用して、検索エンドポイントへのリンクを公開しようとしています。

リソース アセンブラは次のとおりです。

@Component
public class AdminResourceAssembler extends ResourceAssemblerSupport<Admin, AdminResource> {

    public AdminResourceAssembler() {
        super(AdminController.class, AdminResource.class);
    }

    public AdminResource toResource(Admin admin) {
        AdminResource adminResource = createResourceWithId(admin.getId(), admin);
        BeanUtils.copyProperties(admin, adminResource);
        adminResource.add(linkTo(AdminController.class).slash(admin.getId()).slash("module").withRel("module"));        
        return adminResource;
    }

}

エンドポイントコントローラーは次のとおりです。

@RequestMapping(value = UriMappingConstants.PATH_SEPARATOR + UriMappingConstants.SEARCH, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity<PagedResources<AdminResource>> search(@RequestParam(value = "searchTerm", required = true) String searchTerm, @PageableDefault Pageable pageable, PagedResourcesAssembler<Admin> pagedResourcesAssembler, UriComponentsBuilder builder) {
    HttpHeaders responseHeaders = new HttpHeaders();
    Pageable pageRequest = buildPageRequest(pageable.getPageNumber(), pageable.getPageSize());
    Page<Admin> searchedAdmins = adminService.search(searchTerm, pageRequest);
    responseHeaders.setLocation(builder.path(UriMappingConstants.PATH_SEPARATOR + UriMappingConstants.ADMINS + UriMappingConstants.PATH_SEPARATOR + "search").queryParam("searchTerm", searchTerm).queryParam("page", pageable.getPageNumber()).queryParam("size", pageable.getPageSize()).buildAndExpand(searchTerm).toUri());
    PagedResources<AdminResource> adminPagedResources = pagedResourcesAssembler.toResource(searchedAdmins, adminResourceAssembler);
    return new ResponseEntity<PagedResources<AdminResource>>(adminPagedResources, responseHeaders, HttpStatus.OK);
}

private Pageable buildPageRequest(int pageIndex, int pageSize) {
    Sort sort = new Sort(new Sort.Order(Sort.Direction.ASC, "lastname"), new Sort.Order(Sort.Direction.ASC, "firstname"));
    return new PageRequest(pageIndex, pageSize, sort);
}

まず、buildPageRequest メソッドを呼び出して、単純に元のページング可能オブジェクトを検索サービスに渡す必要があるかどうかがわかりません。

私が抱えている問題は2つあります。

応答で公開されたリンクに searchTerm パラメータがありません:

{"rel":"self","href":"http://localhost:8080/nitro-project-rest/admins/search{?page,size,sort}

次のようになると思います:

{"rel":"self","href":"http://localhost:8080/nitro-project-rest/admins/search{?searchTerm,page,size,sort}

繰り返しになりますが、初心者の私にはよくわかりません。

そしてコントローラーは、リクエストで指定したページ番号とサイズの引数を無視して、常に 10 個のアイテムの最初のページをフェッチします。

curl -H "Accept:application/json" --user joethebouncer:mignet http://localhost:8080/nitro-project-rest/admins/search?searchTerm=irstna&page=3&size=5

私は解決策からそれほど遠くないと思いますが、公開されたリンクがどのように見えるべきか正確にはわかりません.

どんな指示もとてもいいでしょう:-)

編集:情報を追加

ページング可能な構成:

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
    argumentResolvers.add(resolver);
    super.addArgumentResolvers(argumentResolvers);
}

このサービスは、リポジトリをラップするだけです。

public Page<Admin> search(String searchTerm, Pageable page) {
  return adminRepository.search(searchTerm, page);
}

これはインターフェースです:

@Query("SELECT a FROM Admin a WHERE LOWER(a.firstname) LIKE LOWER(CONCAT('%', :searchTerm, '%')) OR LOWER(a.lastname) LIKE LOWER(CONCAT('%', :searchTerm, '%')) OR LOWER(a.email) LIKE LOWER(CONCAT('%', :searchTerm, '%')) OR LOWER(a.login) LIKE LOWER(CONCAT('%', :searchTerm, '%')) ORDER BY a.lastname ASC, a.firstname ASC") public 

ページ search(@Param("searchTerm") String searchTerm, Pageable page);

データベースは JPA が前面にある H2 であり、コンソールには次のように表示されます。

オフセットが欠落していることがわかります...

select admin0_.id as id1_1_, admin0_.version as version2_1_, admin0_.email as email3_1_, admin0_.firstname as firstnam4_1_, admin0_.lastname as lastname5_1_, admin0_.login as login6_1_, admin0_.password as password7_1_, admin0_.password_salt as password8_1_, admin0_.post_login_url as post_log9_1_ from admin admin0_ where lower(admin0_.firstname) like lower(('%'||'irstn'||'%')) order by admin0_.lastname ASC, admin0_.firstname ASC, admin0_.lastname asc, admin0_.firstname asc limit 10

敬具、

ステファン・エイバート

4

2 に答える 2

0

愚かな私。複数のパラメーターを許可するために、curl が URL を二重引用符で囲む必要があることを確認できませんでした。curl -H "Accept:application/json" --user joethebouncer:mignet "localhost:8080/nitro-project-rest/admins/… 正常に動作するようになりました。

于 2014-08-19T09:37:23.433 に答える
0

buildPageRequest が何をしているのかわかりません...しかし、あなたはそれを必要とせず、それがページングの問題の原因であるに違いありません

セルフリンクについて。PagedResourceAssembler は非常に単純なデフォルトのものを作成しますが、より複雑なものを作成して toResource メソッドの 3 番目のパラメーターとして渡すことができます。したがって、多くの方法のいずれかで独自のリンクを作成してください。私は次のようなものを提案します:

  linkTo(methodOn(SomeController.class).search(searchTerm, pageable, null, null))

自己リンクをテンプレート化してはならないことに注意してください。これは spring-hateoas のバグです (実際には依存関係です) https://jira.spring.io/browse/DATACMNS-515を参照してください。

于 2014-08-18T21:57:01.917 に答える