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.
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>
.
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.
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.
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.
ich meinen Code aktualisiert Resource<MyInterface>
zu verwenden, und hinzugefügt, um die linkForSingleResource
MyClass
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.