0

使用spring-data,我想爲我的Person實體編寫兩種方法。如何編寫在Spring-Data-hatoas中公開資源或資源列表的分頁控制器

Person.java:

public class Person { 
    @Id 
    String id; 
    String name; 
    Integer age; 
    // getters/setters omitted for clarity 
} 

我寫也是PersonResouce

public class PersonResource extends Resource<Person> { 

    public PersonResource(Person content, Link... links) { 
     super(content, links); 
    } 

} 

我還添加了一個PersonResourceAssembler

public class PersonResourceAssembler extends ResourceAssemblerSupport<Person, PersonResource> { 

    public PersonResourceAssembler() { 
     super(PersonController.class, PersonResource.class); 
    } 

    public PersonResource createResource(Person person) { 
     PersonResource personResource = new PersonResource(person); 
     Link link = linkTo(PersonController.class).slash(person.getId()).withSelfRel(); 
     personResource.add(link); 
     return personResource; 
    } 

    @Override 
    public PersonResource toResource(Person person) { 
     PersonResource resource = createResource(person); 
     return resource; 
    } 
} 

這是我PersonController

@RestController 
@RequestMapping("persons") 
public class PersonController { 

    @Autowired 
    private PersonService personService; 

    @GetMapping 
    public HttpEntity<List<PersonResource>> showAll(@PageableDefault(size = 20) Pageable pageable, PersonDTO condition) { 
    Page<Person> page = personService.findAll(pageable, condition); 
    Iterable<Person> personList = page.getContent(); 
    PersonResourceAssembler assembler = new PersonResourceAssembler(); 
    List<PersonResource> resources = assembler.toResources(personList); 
    return new HttpEntity<>(resources); 
    } 

    @RequestMapping(name = "{id}", produces= MediaType.APPLICATION_JSON_VALUE) 
    public HttpEntity<PersonResource> showOne(@PathVariable("id") Long id, PersonDTO condition) { 
    condition.setId(id); 
    Person person = personService.get(id); 
    PersonResourceAssembler assembler = new PersonResourceAssembler(); 
    PersonResource resource = assembler.toResource(person); 
    return new HttpEntity<>(resource); 
    } 

} 

這是列表中的響應:

[ 
    { 
    "createdById": 1, 
    "createdDate": "2017-09-21T10:21:05.741Z", 
    "deleted": false, 
    "email": null, 
    "firstName": "User49", 
    "id": 52, 
    "lastModifiedById": null, 
    "lastName": "robot", 
    "links": [ 
     { 
     "href": "http://localhost:8080/users/52", 
     "rel": "self" 
     } 
    ], 
    "middleName": null, 
    "mobile": "010101010001149", 
    "roleList": [ 
     { 
     "createdById": null, 
     "createdDate": "2017-09-21T10:21:05.580Z", 
     "deleted": false, 
     "id": 2, 
     "lastModifiedById": null, 
     "name": "USER", 
     "userList": null, 
     "version": 0 
     } 
    ], 
    "username": "user49", 
    "version": 0 
    } 
] 

這是一種資源的響應:

{ 
    "_links": { 
    "self": { 
     "href": "http://localhost:8080/users/52" 
    } 
    }, 
    "createdById": 1, 
    "createdDate": "2017-09-21T10:21:05.741Z", 
    "deleted": false, 
    "email": null, 
    "firstName": "User49", 
    "id": 52, 
    "lastModifiedById": null, 
    "lastName": "robot", 
    "middleName": null, 
    "mobile": "010101010001149", 
    "roleList": [ 
    { 
     "createdById": null, 
     "createdDate": "2017-09-21T10:21:05.580Z", 
     "deleted": false, 
     "lastModifiedById": null, 
     "name": "USER", 
     "userList": null 
    } 
    ], 
    "username": "user49" 
} 

我已經看過了documentation,它似乎可以使用PagedResources來創建分頁。

我也希望我的回答看起來像RepositoryRestController響應,這意味着該列表的回覆:

  • entities下鍵「_embedded」
  • links下鍵「_links」
  • page在關鍵「頁」

image

我試圖玩PagedResources,但它看起來工作不同於Resource,不能代替它。

我想看看使用PagedResource的控制器/彙編程序。

解決方案我

的解決辦法是做這樣的

@GetMapping 
    public ResponseEntity<?> findAll(PagedResourcesAssembler<Person> pageAssembler, @PageableDefault(size = 20) Pageable pageable, UserDTO condition) { 
    Page<User> userList = userService.findAll(pageable, condition); 
    PagedResources<?> resources = pageAssembler.toResource(userList, new UserResourceAssembler()); 
    return ResponseEntity.ok(resources); 
    } 

回答

2

嘗試使用PagedResourcesAssembler建立分頁資源:

@RestController 
@RequestMapping("persons") 
public class PersonController { 

    @Autowired private PersonService personService; 
    @Autowired private PagedResourcesAssembler<Person> assembler; 
    @Autowired private EntityLinks links; 

    @GetMapping("/paged") 
    public ResponseEntity<?> getPaged(Pageable pageable) { 
     Page<Person> personsPage = personService.getPaged(pageable); 

     Link pageSelfLink = links.linkFor(Person.class).slash("/paged").withSelfRel(); 
     PagedResources<?> resources = assembler.toResource(personPage, this::toResource, pageSelfLink); 

     return ResponseEntity.ok(resources); 
    } 

    private ResourceSupport toResource(Person person) { 
     Link pesonLink = links.linkForSingleResource(person).withRel("person"); 
     Link selfLink = links.linkForSingleResource(person).withSelfRel(); 
     return new Resource<>(person, personLink, selfLink); 
    } 
} 

見我example

+0

我已經創建了一個具有'toResource'方法的** UserResourceAssembler **。它寫在我們應該做的文檔中[創建一個專門負責這樣做的類](https://docs.spring.io/spring-hateoas/docs/current/reference/html/#fundamentals.resource-assembler) 。在你的例子中,干擾我的是你不使用它並創建你自己的方法。我想遵循春季推薦並使用不同的課程,但我無法重現您根據我的要求編寫的PageResource行。 – BigDong

+0

在我的示例中,我使用了[toResource](https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/web/PagedResourcesAssembler.html#toResource-org使用自定義彙編器來處理頁面集合的任何元素的「PagedResourcesAssembler」的.springframework.data.domain.Page-org.springframework.hateoas.ResourceAssembler-org.springframework.hateoas.Link-)方法,所以我的'toResource'方法是這個彙編程序的一部分。 – Cepr0

+0

有沒有辦法在一個單獨的類中使用'toResource'方法?就像** UserResourceAssembler **我所做的一樣? – BigDong