2016-10-20 2 views
1

Ich habe ziemlich die gleiche Frage, wie es hier gebeten worden ist (Exposing link on collection entity in spring data REST). Aber nichts von diesem Thema hilft mir, einen benutzerdefinierten Link zum Sammelaufruf hinzuzufügen.Verfügbarmachen der Verbindung auf Ansammlungsentität, die Frühling hateoas verwendet

@Component 
public class EventListResourceProcessor implements ResourceProcessor<Resources<Event>> { 

    @Autowired 
    private RepositoryEntityLinks entityLinks; 

    @Override 
    public Resources<Event> process(Resources<Event> events) { 
     events.add(entityLinks.linkToCollectionResource(Event.class).withRel("events")); 
     return events; 
    } 
} 

Prozessmethode wird in diesem Fall nie aufgerufen.

Ich brauche http://localhost:8080/event anrufen und die folgende JSON mit my_custom_link unter _links Abschnitt erhalten:

{ 
 
    "_embedded": { 
 
    "event": [ 
 
     { 
 
     "id": "1", 
 
     "name": "Updated event" 
 
     }] 
 
    }, 
 
    "_links": { 
 
    "self": { 
 
     "href": "http://localhost:8080/event" 
 
    }, 
 
    "profile": { 
 
     "href": "http://localhost:8080/profile/event" 
 
    }, 
 
    "my_custom_link": { 
 
     "href": "http://localhost:8080/custom/" 
 
    } 
 
    }, 
 
    "page": { 
 
    "size": 20, 
 
    "totalElements": 4, 
 
    "totalPages": 1, 
 
    "number": 0 
 
    } 
 
} 
 

 
}

Könnten Sie bitte mir raten?

Vielen Dank im Voraus!

Antwort

1

Ich war in einer ähnlichen Situation zu Ihrer Frage: Ich hatte die Frage/Antworten gelesen, die Sie verlinkt haben, und keine von ihnen konnte das Problem lösen. Hier war die mögliche Antwort auf mein Problem:

@Component 
public class MyResourceProcessor implements ResourceProcessor<Resource<MyInterface>> { 

    @Autowired 
    private EntityLinks entityLinks; 

    @Override 
    public Resource<MyInterface> process(Resource<MyInterface> event) { 
     event.add(entityLinks.linkForSingleResource(MyClass.class, event.getContent().getId()).slash("custom").withRel("custom")); 
     return event; 
    } 
} 

Diese process Methode für jede Ressource in der jeweiligen Sammlung aufgerufen wurde von Ressourcen zurückgegeben werden. Die MyInterface Schnittstelle und MyClass Klasse sollte ersetzt werden mit allem, was Sie benötigen, aber es war erforderlich, auf diese Weise geschrieben werden, um dies zu arbeiten. Hier sind die Schritte, die ich verwendet habe, um die process Methode korrekt aufgerufen und den MyInterface Typ zu bestimmen.

  1. Ich habe eine process Methode, die einfach ResourceSupport als Parameter hat. Ich erstellte einen Haltepunkt im Code und inspizierte, welche zugrunde liegende Klasse ResourceSupport erweitert wurde. In meinem Fall war es PersistentEntityResource. Dies erklärt, warum unter Verwendung von Resource<MyClass> oder Resources<MyClass> nie die process-Methode aufgerufen wurde: PersistentEntityResource erweitert Resource<Object>.

  2. Ich aktualisiert, um die process Methode nehmen PersistentEntityResource als Parameter. Dies führte dazu, dass die Methode process für mehr als meine beabsichtigten Änderungen aufgerufen wurde. Ich habe erneut den Haltepunkt verwendet, um das Objekt PersistentEntityResource zu untersuchen, um herauszufinden, welche Klasse in der Erweiterung Resource<Object> gefunden werden konnte. Ich entdeckte, dass es eine Proxy Klasse war, und konnte nicht zu MyClass umgewandelt werden, wie ich es gewünscht hatte.

  3. Ich folgte der Antwort hier gefunden, um weitere Informationen über die Proxy Klasse zu finden: https://stackoverflow.com/a/3344386/1417690. Während des Debugging habe ich die Liste der Interfaces entdeckt, die zur Definition dieser Klasse beigetragen haben. Einer von ihnen war vom Typ MyProjectionInterface. Ich wusste jetzt, dass der Grund, warum ich Resource<Portal> nicht verwenden konnte, war, weil es tatsächlich ein Resource<MyProjectionInterface> war.

  4. Ich hatte drei verschiedene Projections, die ich handhaben musste. Anstatt drei separate ResourcePorcoessors zu erstellen, erstellte ich die MyInterface und hatte alle drei meiner projection Schnittstellen erweitern es. Die MyInterface enthielt nur eine Long getId() Methode, die alle projections sowieso schon unterstützt.

  5. ich meinen Code aktualisiert Resource<MyInterface> zu verwenden, und hinzugefügt, um die linkForSingleResourceMyClass mit (dass alle von den projections betreffen) und die getId() Methode, die ich hatte in MyInterface definiert. Dies hat den gewünschten Link zu jeder der zurückgegebenen Ressourcen erfolgreich hinzugefügt.

Hoffentlich werden diese Schritte helfen anderen entdecken, wie zu bestimmen, welche Art für die process Methode als Parameter zu verwenden.

Verwandte Themen