2014-06-17 12 views
7

Utilizzo dei dati di primavera REST È stato esposto uno ProjectRepository che supporta l'elencazione dei progetti e l'esecuzione di operazioni CRUD su di essi. Quando vado a http://localhost:8080/projects/ ottengo l'elenco dei progetti come mi aspetto.Esposizione del collegamento sull'entità di raccolta nei dati primaverili REST

Quello che sto cercando di fare è aggiungere un'azione personalizzata alla sezione _links della risposta JSON per la Raccolta progetti.

Per esempio, mi piacerebbe la chiamata a http://localhost:8080/projects/ per tornare qualcosa di simile:

{ 
    "_links" : { 
    "self" : { 
     "href" : "http://localhost:8080/projects/{?page,size,sort}", 
     "templated" : true 
    }, 
    "search" : { 
     "href" : "http://localhost:8080/projects/search" 
    }, 
    "customAction" : { 
     "href" : "http://localhost:8080/projects/customAction" 
    } 
    }, 
    "page" : { 
    "size" : 20, 
    "totalElements" : 0, 
    "totalPages" : 0, 
    "number" : 0 
    } 
} 

Dove customAction è definito in alcuni controller.

Ho cercato di creare la seguente classe:

public class ProjectCollectionResourceProcessor implements ResourceProcessor<Resource<Collection<Project>>> { 

    @Override 
    public Resource<Collection<Project>> process(Resource<Collection<Project>> listResource) { 
     // code to add the links to customAction here 
     return listResource; 
    } 

} 

e aggiungendo aggiungendo la seguente Bean per la mia configurazione di applicazioni:

@Bean 
public ProjectCollectionResourceProcessor projectCollectionResourceProcessor() { 
    return new ProjectCollectionResourceProcessor(); 
} 

Ma non process(...) fa mai sembrano avere chiamato. Qual è il modo corretto di aggiungere collegamenti a raccolte di risorse?

+0

Vedi anche, questa domanda: http://stackoverflow.com/q/40156413 –

risposta

4

Le risorse di raccolta rendono un esempio di Resources<Resource<Project>>, non Resource<Collection<Project>>. Quindi, se si modifica la tipizzazione generica nell'implementazione ResourceProcessor di conseguenza, dovrebbe funzionare come previsto.

+0

aggiungendo di seguito il codice non ha aiutato 'public class ProjectsResourceProcessor implementa \t \t ResourceProcessor > { \t @Autowired \t entità EntityLinks entitàLink; \t @Override \t risorse pubbliche processo (Risorse risorse) { \t \t resources.add (entityLinks.linkFor (Project.class) .slash ("custom") \t \t \t \t .withRel ("su misura")); \t \t risorse di ritorno; \t} } 'Utilizzo di SDR-2.1.0.RELEASE – Stackee007

+0

Per poter funzionare correttamente ho dovuto implementare' ResourceProcessor 'e all'interno del codice determinare se si trattasse di una risorsa' Project'. Grazie per l'aiuto. –

+0

@ thorben.jakobsen Sto cercando alcune risorse (quelle di apprendimento :-) per implementare la tua soluzione. Ho anche una risorsa paginata. – Stephane

4

Ho avuto lo stesso problema. Che cosa ha funzionato per me è stato:

public class ProjectsResourceProcessor implements ResourceProcessor<PagedResources<Resource<Project>>> { 

    private final @NonNull EntityLinks entityLinks; 

    @Override 
    public PagedResources<Resource<Project>> process(PagedResources<Resource<Project>> pagedResources) { 

     ... 

     return pagedResources; 
    } 
} 
+0

quando non esiste alcun progetto, i collegamenti non vengono visualizzati: '( – Kakawait

+0

Esiste un controllo esplicito in ResourcesProcessorWrapper :: isValueTypeMatch da controllare per il contenuto vuoto e impedisce l'accensione del processore risorse. –

+2

yup fronte allo stesso problema .. qualsiasi hack per superare questo –