Mit Feder-Daten möchte ich zwei Methoden für meine Einheit schreiben.Wie paginated Controller zu schreiben, die Ressource oder Liste der Ressource im Frühjahr-Daten-hatoas freizugeben
Person.java:
public class Person {
@Id
String id;
String name;
Integer age;
// getters/setters omitted for clarity
}
Ich habe auch eine PersonResouce
geschrieben:
public class PersonResource extends Resource<Person> {
public PersonResource(Person content, Link... links) {
super(content, links);
}
}
Ich habe auch eine PersonResourceAssembler
hinzugefügt:
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;
}
}
Und das ist mein 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);
}
}
Dies ist die Antwort für die Liste:
[
{
"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
}
]
Dies ist die Antwort für eine Ressource:
{
"_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"
}
ich am documentation geschaut haben und es scheint möglich PagedResources zu verwenden um Seitenumbruch zu erstellen.
ich meine Antwort auch wie die RepositoryRestController
Antwort aussehen soll, die für die Liste reponse bedeutet:
entities
unter Schlüssel setzen "_embedded"- setzen
links
unter dem Schlüssel "_links" - setzen
page
unter der Taste "Seite"
Ich habe versucht, ein wenig mit PagedResources
zu spielen, aber es scheint anders zu funktionieren als Resource
und kann es nicht einfach ersetzen.
Ich möchte einen Controller/Assembler sehen, der die PagedResource verwendet.
Lösung
Lösung war für mich wie diese
@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);
}
Ich habe einen ** UserResourceAssembler ** erstellt, der über die Methode 'toResource' verfügt. Es steht in der Dokumentation, die wir machen sollten [eine dafür zuständige Klasse erstellen] (https://docs.spring.io/spring-hateoas/docs/current/reference/html/#fundamentals.resource-assembler) . Was mich in Ihrem Beispiel stört ist, dass Sie es nicht verwenden und Ihre eigene Methode erstellen.Ich möchte der Frühjahrsempfehlung folgen und eine andere Klasse verwenden. Ich konnte die PageResource-Zeile, die Sie mit meinen Anforderungen geschrieben haben, nicht reproduzieren. – BigDong
In meinem Beispiel verwende ich diese [toResource] (https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/web/PagedResourcesAssembler.html#toResource-org .springframework.data.domain.Page-org.springframework.hateoas.ResourceAssembler-org.springframework.hateoas.Link-) Methode von 'PagedResourcesAssembler', die einen benutzerdefinierten Assembler für ein beliebiges Element von Seitensammlungen verwendet, also ist meine' toResource' Methode a Teil dieses Assembler. – Cepr0
Gibt es eine Möglichkeit, diese toResource-Methode in einer separaten Klasse zu verwenden? Wie der ** UserResourceAssembler **, den ich gemacht habe? – BigDong