0

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"

image

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

Antwort

2

Versuchen zu tun PagedResourcesAssembler zu verwenden ausgelagerten Ressourcen zu bauen:

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

mein Siehe example.

+0

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

+0

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

+0

Gibt es eine Möglichkeit, diese toResource-Methode in einer separaten Klasse zu verwenden? Wie der ** UserResourceAssembler **, den ich gemacht habe? – BigDong

Verwandte Themen