Ausschließen einige Felder des Spring-data-rest-Ressource
Ich versuche, Spring-data-rest mit spring-data-mongodb aussetzen, nur-lese-Ressourcen.
Das problem habe ich begegnete, ist, dass will ich haben unterschiedliche Ansichten von meine Dokumente.
Sagen wir, ich habe einige private Informationen in einem Dokument, das möchte ich nicht setzen Sie Sie öffentlich.
Also versuchte ich mehrere Möglichkeiten.
Ich Lesen Sie diesen Beitrag https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring Beschreibung wie zu verwenden JsonView, um zu wählen Sie die Felder, die wir verfügbar machen möchten.
Habe ich versucht, wie diese :
@RepositoryRestResource(collectionResourceRel = "recommandation", path = "recommandations")
interface RecommandationRepository extends MongoRepository<Recommendation, ObjectId> {
@Override
@JsonView(View.Public.class)
Iterable<Recommendation> findAll(Iterable<ObjectId> objectIds);
... //other find methods
}
Es nicht funktioniert. Es ist aber sagte in den Kommentaren : https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring#comment-1725671983
Die Antwort deutet auf die Verwendung von @Projektionen
Aber @Projektionen Ergebnis in der url so : ".../Empfehlungen{?Projektion}"
Es bedeutet, dass die Projektion ist nur eine option, um die vollständige Objekt ist immer noch ausgesetzt.
Gibt es eine andere Methode, die hier beschrieben https://github.com/spring-projects/spring-data-rest/wiki/Configuring-the-REST-URL-path
Es empfiehlt @RestResource(exportiert = false) Anmerkung für die Felder, die wir nicht wollen, zu entlarven.
Aber es ist nicht flexibel. Wenn ich Belichten möchte einem öffentlichen nur-lese-API und einen privaten full access API. Diese Anmerkung kann nicht deaktiviert werden pro-api.
Gibt es einen anderen Vorschlag ?
- Wie wollen Sie unterscheiden zwischen den öffentlichen und privaten APIs? Sie haben zwei repositories für die gleiche Klasse? Wie wäre es mit zwei Klassen dann?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der wichtige Punkt ist, dass Spring Data REST nutzt Jackson die Serialisierung von Parametern basierend auf dem domain-Objekt, nicht der definition im repository. Eine einfache Methode zum ausblenden von einem bestimmten Bereich aus, die in der JSON sieht so aus:
In diesem Beispiel, meine User-Objekt wird NIE exportieren ein Kennwort Feld, egal wie diese Entität verwendet wird. Jackson unterstützt, entweder indem diese auf das Feld, oder setzen Sie auf die entsprechende getter-Methode.
Wenn Sie @JsonIgnore in das domain model, es macht es der Standard-definition. Projektionen sind Optionen zu ändern, welche Felder Rendern. Betrachten wir das folgende Beispiel:
Dieses Projekt kann nur verwendet werden, wenn das rendering Element domain-Objekte. Es ist nicht die Standard-Ansicht, sondern stattdessen eine option zur Nutzung über ?Projektion=noImages. Aber vergessen Sie nicht: wenn es Zeit für die Jackson-Serialisierung, wird das Projekt überschreiben, das domain-Modell-Einstellungen. Das heißt, Sie können schreiben, eine Projektion, die Benutzer Objekt oben und haben es String getPassword(). Dies hätte Vorrang vor den domain-Modell standardmäßig eine wiederum exportieren ein Kennwort. Die Verantwortung liegt bei Ihnen.
Eine Letzte Sache. Spring Data REST unterstützt Auszug Projektionen. Der häufigste Anwendungsfall ist, wo Sie eine Kunden Objekts in Bezug auf ein Adresse Objekt. Standardmäßig ist die Beziehung zu finden Sie die Adresse des Kunden, die zeigen würde, eine URI zu navigieren. Aber wenn Sie wollen, die Adressinformationen, die alle die Zeit, dies können Sie vermeiden, extra BEKOMMEN Betrieb durch die Erstellung einer Projektion, die macht der Adressdaten. Dann können Sie konfigurieren, dass für Kunden Objekte, schalten Sie die Projektion von Standard-und im wesentlichen inline die Adresse, die details, wenn Sie Holen einen customer-Datensatz.
Erkenne ich die Referenz docs sind nicht ganz up-to-date auf all diese details. Sie können unsere Fortschritte zu aktualisieren, die Dokumentation entsprechend wie folgt:
Es ist auch ein Fehler, dass die ALPEN Metadaten von Spring Data REST auch Bedürfnisse heraus zu filtern und domain-Felder markiert mit @JsonIgnore (siehe https://jira.spring.io/browse/DATAREST-463)
P. S. @RestResource ist veraltet und wird nicht den empfohlenen Ansatz für die Festlegung, welche Felder exportiert?. Verwenden Sie stattdessen @JsonIgnore, wie oben gezeigt.
@JsonIgnore
vollständig entfernt, die Felder aus der Antwort. Wie die Rückkehr der read-only-Felder in der Antwort aber lass Sie aktualisiert werden?Pro @johannes-rudolph Vorschlag...
Sich diese Einstellung auf das Feld (oder property-wenn Sie eine Zuordnung von Accessoren):
Das tut, was der access-Wert bedeutet: markieren Sie das zugehörige Feld als nur schreiben. Somit kann der Wert festgelegt werden, aber nicht abgerufen, über die Jackson/JSON-serialisierten form.