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
在關鍵「頁」
我試圖玩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);
}
我已經創建了一個具有'toResource'方法的** UserResourceAssembler **。它寫在我們應該做的文檔中[創建一個專門負責這樣做的類](https://docs.spring.io/spring-hateoas/docs/current/reference/html/#fundamentals.resource-assembler) 。在你的例子中,干擾我的是你不使用它並創建你自己的方法。我想遵循春季推薦並使用不同的課程,但我無法重現您根據我的要求編寫的PageResource行。 – BigDong
在我的示例中,我使用了[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
有沒有辦法在一個單獨的類中使用'toResource'方法?就像** UserResourceAssembler **我所做的一樣? – BigDong