Schließen Sie einige Felder der Spring-Datenrest-Ressource aus

7

Ich versuche Spring-data-rest mit spring-data-mongodb zu verwenden, um schreibgeschützte Ressourcen verfügbar zu machen.

Das Problem, dem ich begegnet bin, ist, dass ich unterschiedliche Ansichten meiner Dokumente haben möchte. Nehmen wir an, ich habe einige private Informationen in einem Dokument, ich möchte sie nicht öffentlich zugänglich machen.

Also habe ich verschiedene Wege ausprobiert. Ich habe diesen Beitrag Ссылка gelesen und beschrieben, wie man JsonView in der richtigen Reihenfolge benutzt um die Felder auszuwählen, die wir ausstellen möchten.

Ich habe es so versucht:

%Vor%

}

Es funktioniert nicht. Es wird jedoch in den Kommentaren gesagt: Ссылка Die Antwort schlägt vor, @Projections zu verwenden Allerdings haben @Projections eine ähnliche URL: "... / recommandations {? Projection}" Es bedeutet, dass die Projektion nur eine Option ist, so dass das gesamte Objekt immer noch verfügbar ist.

Es gibt eine andere hier beschriebene Methode Ссылка Es wird vorgeschlagen, die @RestResource-Annotation (export = false) für die Felder zu verwenden, die nicht angezeigt werden sollen.

Aber es ist nicht flexibel. Wenn ich eine öffentliche schreibgeschützte API und eine private Vollzugriffs-API bereitstellen möchte. Diese Annotation kann nicht per API deaktiviert werden.

Gibt es einen anderen Vorschlag?

    
Hugo Lassiège 04.02.2015, 13:15
quelle

2 Antworten

14

Wichtig ist, dass Spring Data REST Jackson-Serialisierungsparameter verwendet, die auf dem Domänenobjekt und nicht auf der Repository-Definition basieren. Eine einfache Möglichkeit, ein bestimmtes Feld vor dem Erscheinen in JSON zu verbergen, ist wie folgt:

%Vor%

In diesem Beispiel exportiert mein Benutzerobjekt NIEMALS ein Passwortfeld, egal wie diese Entität verwendet wird. Jackson unterstützt dies entweder auf dem Feld oder setzt die entsprechende Getter-Methode ein.

Wenn Sie @JsonIgnore in das Domänenmodell einfügen, wird dies zur Standarddefinition. Projektionen sind Optionen, um zu ändern, welche Felder gerendert werden. Sehen Sie sich das folgende Beispiel an:

%Vor%

Dieses Projekt kann nur beim Rendern von Objektobjekten Item verwendet werden. Es ist nicht die Standardansicht, sondern eine Option, die über ? Projection = noImages verwendet werden kann. Aber vergessen Sie nicht: Wenn es um die Jackson-Serialisierung geht, überschreibt das Projekt die Einstellungen des Domain-Modells. Das bedeutet, dass Sie eine Projektion für das oben genannte Benutzer -Objekt schreiben können und es String getPassword () enthalten kann. Dies würde die Standardeinstellung des Domänenmodells überschreiben und wiederum ein Kennwort exportieren. Verantwortung gehört Ihnen.

Eine letzte Sache. Spring Data REST unterstützt Auszugsprojektionen . Der häufigste Anwendungsfall ist, wenn Sie ein Objekt Kunde für ein Address -Objekt haben. Standardmäßig zeigt die Beziehung zum Anzeigen der Adresse eines Kunden einen zu navigierenden URI. Wenn Sie jedoch die Adressinformationen ständig benötigen, können Sie diese zusätzliche Operation GET vermeiden, indem Sie eine Projektion erstellen, die die Adressdetails darstellt. Dann können Sie das für Kunden -Objekte konfigurieren, indem Sie diese Projektion standardmäßig aktivieren und die Adressdetails beim Abrufen eines Kundendatensatzes im Wesentlichen inline einfügen.

Mir ist klar, dass die Referenzdokumente nicht über all diese Details auf dem Laufenden sind. Sie können unseren Fortschritt verfolgen, um die Dokumente wie folgt zu aktualisieren:

Es gibt auch einen Fehler darin, dass die ALPS-Metadaten von Spring Data REST auch Domänenfelder ausfiltern müssen, die mit @JsonIgnore gekennzeichnet sind (siehe Ссылка )

P.S. @RestResource ist veraltet und nicht die empfohlene Methode zum Festlegen der exportierten Felder. Verwenden Sie stattdessen @JsonIgnore wie zuvor gezeigt.

    
gregturn 04.02.2015 17:34
quelle
8

Per @ johannes-rudolph Vorschlag ...

Ziehen Sie in Betracht, diese Einstellung auf das Feld (oder die Eigenschaft, wenn Sie von Zugriffsmethoden zuordnen) anzuwenden:

%Vor%

Dies bedeutet, was der Zugriffswert impliziert: Markieren des zugehörigen Feldes als schreibgeschützt. Daher kann der Wert festgelegt werden, aber nicht über das serialisierte Jackson / JSON-Formular abgerufen werden.

    
sofend 11.04.2017 23:05
quelle