Exclure certains champs de source de données reste des ressources
Je suis en train d'utiliser Spring-data-reste avec ressort de données mongodb pour exposer en lecture seule de ressources.
Le problème que j'ai rencontré, c'est que je veux avoir différents points de vue de mes documents.
Disons que j'ai quelques informations privées dans un document, je ne veux pas les exposer publiquement.
Donc j'ai essayé de plusieurs façons.
J'ai lu ce post https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring décrivant comment utiliser JsonView afin de sélectionner les champs que nous voulons exposer.
J'ai essayé comme ceci :
@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
}
Ça ne fonctionne pas. Cependant, il est dit dans les commentaires : https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring#comment-1725671983
La réponse suggère d'utiliser @Projections
Toutefois @Projections de résultat dans l'url comme ça : ".../recommandations{?projection}"
Cela signifie que la projection est juste une option, de sorte que l'intégralité de l'objet est toujours exposé.
Il y a une autre méthode décrite ici https://github.com/spring-projects/spring-data-rest/wiki/Configuring-the-REST-URL-path
Il suggère d'utiliser @RestResource(exporté = false) annotation pour les champs nous ne voulons pas nous exposer.
Mais il n'est pas souple. Si je veux exposer un public en lecture seule API et d'une salle d'accès complet de l'API. Cette annotation ne peut pas être désactivé par l'api.
Est-il une autre suggestion ?
OriginalL'auteur Hugo Lassiège | 2015-02-04
Vous devez vous connecter pour publier un commentaire.
Le point important est que le Printemps de Données RESTE utilise Jackson sérialisation les paramètres en fonction du domaine d'objet, pas de définition dans le référentiel. Une façon simple de masquer un champ particulier d'apparaître dans le JSON est comme ceci:
Dans cet exemple, l'objet ne sera JAMAIS à l'exportation d'un champ de mot de passe, peu importe comment cette entité est utilisé. Jackson prend en charge de mettre cela sur le terrain, de les mettre sur la méthode de lecture.
Quand vous mettez @JsonIgnore dans le modèle de domaine, il rend la définition par défaut. Les Projections sont des options à modifier ce champs se rendait. Regardez l'exemple suivant:
Ce projet ne peut être utilisée pour le rendu Élément des objets du domaine. Ce n'est pas la vue par défaut, mais plutôt une option pour utiliser via ?projection=noImages. Mais n'oubliez pas: quand vient le temps d'appliquer Jackson la sérialisation, le projet permettra de remplacer le modèle de domaine. Cela signifie que vous pouvez écrire une projection pour que Utilisateur objet ci-dessus et y inclure la Chaîne getPassword(). Cela permettrait de remplacer le modèle de domaine par défaut de réglage d'un tour à l'exportation d'un mot de passe. La responsabilité est la vôtre.
Une dernière chose. Printemps de Données RESTE prend en charge Extrait Projections. L'utilisation la plus courante de cas est l'endroit où vous avez une Client objet lié à un Adresse objet. Par défaut, le lien pour voir un client à l'adresse de montrer une URI pour naviguer. Mais si vous êtes désireux de l'information d'adresse de tous les temps, vous pouvez éviter ce supplément OBTENIR opération en créant une projection qui rend les détails de l'adresse. Ensuite, vous pouvez le configurer pour Client objets, tourner sur cette projection par défaut et essentiellement inline les détails de l'adresse à chaque fois que vous récupérez un enregistrement de client.
Je me rends compte de la référence docs ne sont pas tout à fait à jour sur tous ces détails. Vous pouvez suivre nos progrès pour mettre à jour la documentation convenablement comme suit:
Il y a aussi un bug dans les ALPES de métadonnées à partir de Données du Printemps RESTE aussi besoin de filtrer domaine champs marqués avec @JsonIgnore (voir https://jira.spring.io/browse/DATAREST-463)
P. S. @RestResource est obsolète et ne pas l'approche recommandée pour la configuration des champs exportés. Au lieu de cela, utiliser @JsonIgnore comme indiqué plus haut.
@JsonIgnore
supprime complètement les champs de la réponse. Comment retourner les champs en lecture seule dans la réponse, mais simplement laisser les mettre à jour?C'est une Jackson problème de configuration: voir question pour plus de détails.
Si j'ai besoin d'une représentation interne (permettant à ce champ pour être affiché et modifié) et d'un accès en lecture seule représentation qui ne veulent pas montrer ce domaine à tous, @JsonIgnore ne va pas m'aider ? Il va supprimer le champ pour les deux représentations, non ?
J'ai eu des exigences similaires à cacher supprimer des champs dans les données du printemps reste de la réponse dynamique. Je me demandais si nous pouvons crochet @jsonfilter pour certaines entités, via Jackson modules pour travailler avec les données du printemps reste
JsonProperty.D'accès.WRITE_ONLY)
OriginalL'auteur gregturn
Par @johannes-rudolph suggestion...
D'envisager l'application de ce paramètre sur le terrain (ou bien si vous êtes à la cartographie de l'accesseurs):
Ce n'est ce que l'accès de la valeur implique: le marquage du champ associé en écriture seule. Ainsi, la valeur peut être définie, mais pas récupéré par l'Jackson/JSON forme sérialisée.
OriginalL'auteur sofend