2014-06-17 7 views
7

Mit Federdaten REST habe ich eine ProjectRepository ausgesetzt, die Projekte unterstützt und CRUD-Operationen auf ihnen ausführen. Wenn ich zu http://localhost:8080/projects/ gehe, bekomme ich die Liste der Projekte, wie ich es erwarte.Verfügbarmachen des Links auf Collection Entity im Frühjahr Daten REST

Was ich versuche, ist eine benutzerdefinierte Aktion zum _links Abschnitt der JSON-Antwort für die Project Collection hinzufügen.

Zum Beispiel würde ich den Anruf an http://localhost:8080/projects/ mag so etwas wie dies zurück:

{ 
    "_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 
    } 
} 

Wo customAction in einigen Controller definiert ist.

Ich habe versucht, die folgende Klasse zu erstellen:

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

} 

und das Hinzufügen Hinzufügen des folgenden Bean meine Anwendungen Konfiguration:

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

Aber process(...) nicht immer scheint genannt werden. Was ist der richtige Weg, Links zu Sammlungen von Ressourcen hinzuzufügen?

+0

Siehe auch diese Frage: http://stackoverflow.com/q/40156413 –

Antwort

4

Die Auflistungsressourcen rendern eine Instanz von Resources<Resource<Project>>, nicht Resource<Collection<Project>>. Also, wenn Sie die generische Eingabe in Ihrer ResourceProcessor Implementierung entsprechend ändern, sollte das so funktionieren, wie Sie es erwarten.

+0

Zugabe unter Code nicht helfen 'public class ProjectsResourceProcessor \t \t ResourceProcessor implementiert > { \t @Autowired \t private EntityLinks entityLinks; \t @Override \t öffentlichen Ressourcen Prozess (Ressourcen Ressourcen) { \t \t resources.add (entityLinks.linkFor (Project.class) .slash ("custom") \t \t \t \t .withRel ("custom")); \t \t Ressourcen zurückgeben; \t} } 'Mit SDR-2.1.0.RELEASE – Stackee007

+0

Um für mich ich umsetzen mussten, um zur Arbeit bekommen' ResourceProcessor 'und innerhalb des Codes festzustellen, ob es sich um eine' project' Ressource war. Danke für die Hilfe. –

+0

@ thorben.jakobsen Ich suche nach ein paar Ressourcen (lernende :-) um deine Lösung zu implementieren. Ich habe auch eine ausgelagerte Ressource. – Stephane

4

Ich hatte das gleiche Problem. Was für mich gearbeitet wurde:

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

aufgerufen, wenn kein Projekt vorhanden ist, werden keine Links angezeigt: '( – Kakawait

+0

) Es gibt eine explizite Überprüfung in ResourcesProcessorWrapper :: isValueTypeMatch für leeren Inhalt und es verhindert, dass der Ressourcen-Prozessor feuern. –

+2

Yup mit dem gleichen Problem .. jeder Hack, um dies zu überwinden –