2015-08-10 12 views
7

Sto utilizzando Spring-data-rest per fornire API di lettura su alcune entità JPA. Per le scritture ho bisogno di emettere Comando oggetti piuttosto che direttamente scrivere al DB, così ho aggiunto un controller personalizzato utilizzando @RepositoryRestController e vari metodi di gestione dei comandi:Collegamenti di entità di riempimento in metodi personalizzati @RepositoryRestController

@RequestMapping(method = RequestMethod.POST) 
public @ResponseBody MyEntity post(@RequestBody MyEntity entity) { 
    String createdId = commands.sendAndWait(new MyCreateCommand(entity)); 
    return repo.findOne(createdId); 
} 

vorrei l'uscita ad arricchirsi come qualsiasi altro risposta dal controller spring-data-rest, in particolare voglio aggiungere i link HATEOAS a se stesso e alle sue relazioni.

risposta

11

Questo è stato recentemente answered (vedere il punto 3.) per lo stesso Oliver Gierke (la domanda ha usato parole chiave abbastanza diverse, quindi non contrassegnerò questo come duplicato).

L'esempio per una singola entità diventerebbe:

@RequestMapping(method = RequestMethod.POST) 
public @ResponseBody PersistentEntityResource post(@RequestBody MyEntity entity, 
    PersistentEntityResourceAssembler resourceAssembler)) { 
    String createdId = commands.sendAndWait(new MyCreateCommand(entity)); 
    return resourceAssembler.toResource(repo.findOne(createdId)); 
} 

L'esempio di un profilo non paginated:

@RequestMapping(method = RequestMethod.POST) 
public @ResponseBody Resources<PersistentEntityResource> post(
    @RequestBody MyEntity entity, 
    PersistentEntityResourceAssembler resourceAssembler)) { 
    List<MyEntity> myEntities = ... 
    List<> resources = myEntities 
     .stream() 
     .map(resourceAssembler::toResource) 
     .collect(Collectors.toList()); 
    return new Resources<PersistentEntityResource>(resources); 
} 

Infine, una risposta paging si dovrebbe usare un PagedResourcesAssembler iniettato, passando nel metodo ResourceAssembler e nella pagina iniettati dal metodo, anziché creare un'istanza di risorse. Maggiori dettagli su come utilizzare PersistentEntityResourceAssembler e PagedResourcesAssembler possono essere trovati in this answer. Nota che al momento ciò richiede l'uso di tipi grezzi e cast non controllati.

C'è spazio per l'automazione, forse sono le soluzioni migliori.

P.S .: Ho anche creato un JIRA ticket per aggiungerlo alla documentazione di Spring Data.

+0

questo sarebbe un esempio più dettagliato dell'opzione 3 di Gierke: http://stackoverflow.com/a/29924387/1938607? –

+0

Esattamente, ho aggiornato la mia risposta di conseguenza. – hzpz

+0

Mancano ancora alcuni bit importanti: 1) come si ottiene da "MyEntity'" a "PersistentEntityResource". 2) L'esempio indirizzato a una raccolta impaginata, per una singola entità il processo è diverso. Proverò da solo a risolverli. –

Problemi correlati