1

Faire simple RestControllerErreur sur la génération d'auto lien sur la ressource paginable

@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); 
    } 

} 

Lorsque je tente d'obtenir la page curl "http://localhost:8080/datas?param=12&page=2" ont un problème avec la génération d'auto-lien

{ 
    "_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 
    } 
} 

À mon avis, l'auto lien devrait être http://localhost:8080/datas?param=12&page=2&size=10.

Maintenant, je peux résoudre ce problème sans utiliser pageable dans les arguments, juste la page et la taille exacte des paramètres. Mais, j'espère qu'il ya une solution avec pageable

J'ai vu que dans le cas de printemps-données-repos auto ont un type de modèle. Mais je voudrais obtenir l'URL que j'ai demandé

Répondre

1

À mon avis, le lien auto devrait être http://localhost:8080/datas?param=12&page=2&size=10.

Je suis d'accord. En fait, cela semble être un bug. La version la plus récente de PagedResourcesAssembler fait différemment:

Link selfLink = link.map(it -> it.withSelfRel())// 
       .orElseGet(() -> createLink(base, page.getPageable(), Link.REL_SELF)); 

(source)

versions Buggy de cette classe font ceci:

resources.add(createLink(base, null, Link.REL_SELF)); 

La méthode createLink est jamais passé le nécessaire Pageable, mais null comme deuxième argument.

Donc, si vous ne pouvez pas passer à la version la plus récente, vous pouvez encore travailler-autour:

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());