J'ai une classe qui possède des informations des utilisateurs, y compris le champ de mot de passe. Lorsque l'utilisateur se connecte, il retournera tout de classe, y compris le mot de passe. Comment ne pas tout retourner de la classe, à l'exception du mot de passe ou de toutes les données importantes qui ne subsistent que dans la base de données.
J'ai essayé d'utiliser la carte Cela renvoie également la façon dont je veux, mais j'espérais que s'il y a quelque chose de plus facile ou plus rapide, puis map. P>
Il y a peu de réponses suggérant d'utiliser JSONIGNORE et transitoire. Si j'utilise ces deux méthodes, je ne suis pas capable de vous connecter. Parce que j'ai besoin de mot de passe de retour pour la connexion. p>
ma classe de pojo p> class de repo p> ceci est reposer API p> Y a-t-il une meilleure façon alors cartographier. Toute suggestion peut être utile. P> p>
7 Réponses :
Donc, il y a 2 façons différentes, vous pouvez aborder ce problème. P>
transitoire code> dans votre classe d'entité. LI>
ol>
De cette façon, lorsque vous récupérez l'objet Utilisateurs, le champ de mot de passe serait vide. P>
désavantage strong>: passer par mot de passe transitoire entraînerait le fait que vous ne seriez pas en mesure d'obtenir un mot de passe via votre entité dans votre application. P>
- Utilisez
@jsonignore code> (de la bibliothèque Jackson) sur le champ Mot de passe. De cette façon, lorsque vous retournez l'objet de l'objet Utilisateurs, le champ de mot de passe serait ignoré. LI>
ol>
désavantage strong>: cela signifie à nouveau que, si vous souhaitez prendre le champ de mot de passe comme un champ de mot de passe d'entrée ou de retour sur l'application, vous ne pourriez pas le faire.
En outre, il n'est pas recommandé de revenir à l'objet de votre classe de pojo à titre de réponse. P>
Donc, vous pouvez y aller avec l'un ou l'autre gardant à l'esprit les inconvénients de chaque approche. P>
Merci, mais je devrai vérifier le mot de passe de connexion. Donc, les deux sens ne sont pas utiles pour cette situation. Merci encore, je ne savais pas à propos de ces deux manières.
Fabrication de champ transitoire ne sauvera pas / persister le champ particulier dans dB afin que l'approche 1 est la mauvaise solution. En outre, JSONIGNORE fonctionnera pour des réponses JSON Serialize / désérialisez JSON, mais dans cette question, nous pouvons voir que l'utilisateur tente de charger des données dans le code Java.
Outre la réponse déjà mentionnée, peu d'autres manières sont également présentes telles que JSONIGRAPERTES, JSONIMORETYPE, JSONFILTER. Je préfère JSONIGNORE pour supprimer le champ dans la sortie. p>
Voici un lien vers un bel exemple https://www.baeldung.com/jackson-ignore-properties-on- sérialisation p>
En outre, vous pouvez toujours créer une classe de pojo séparée pour revenir aux valeurs des désires. P>
En réalité, il y a un Way dans les requêtes JPA pour ne renvoyer que le champ spécifique pour que vous puissiez peut utiliser directement tout en récupérant les résultats. P>
Mais dans le cas où vous ne voulez pas perturber la méthode FoundByAusername que de créer un objet de classe d'utilisateurs et définir uniquement les champs souhaités. P>
L'approche que vous utilisez actuellement est également une solution réalisable. P>
Je pense que je vais aller avec la voie de la requête. Je vais essayer demain
La meilleure pratique typique ici est de traiter le mot de passe comme une sous-source em>: logiquement pas une partie directe de la ressource utilisateur, mais elle est liée à elle (par exemple, elle pourrait avoir sa propre URL au Cet exemple montre pourquoi il n'est pas une bonne idée d'utiliser les classes (enfin, si vous faites em> vous trouvez à renvoyer une carte / utilisateurs / {id} / mot de passe code>). Le repos de données de printemps gère automatiquement lorsque vous avez une relation JPA
@onetoone code>, mais il n'y a aucun problème à le faire vous-même. P>
@enty code> directement en tant que représentations de l'API JSON, car vous voudrez peut-être avoir des différences internes (y compris la modification de l'avenir sans déranger. clients). Au lieu de cela, utilisez un objet transfert de données em> (DTO) qui sert de "copie JSON" de votre entité. Des outils tels que MAPStructeur Fonctionner très simple de copier des propriétés entre
utilisateur code> et
userDo < / code>. p>
nue code> pour une raison étrange, ce qui se produit, il est généralement préférable d'utiliser
carte. de ("clé", valeur) code> pour la simplicité.) p>
Une autre solution pourrait créer une méthode dans le référentiel avec @Quisery Annotation comme: puis dans votre classe de myenté crée un constructeur qui correspondant au constructeur de la requête. P> En dernier, dans votre contrôleur: p> au lieu de: p> faire: p> retour Cause directement Spring Ayez naturellement une intégration naturelle avec Jackson Serialization, donc par défaut, votre réponse sera un objet JSON P> Je pense que cette solution est une bonne alternative dans votre cas. P> P>
Si vous souhaitez exclure le mot de passe de la réponse, annotez le champ de mot de passe avec Si vous souhaitez exclure plus d'un champ dans l'utilisateur Utilisez Exemple: P> @jsonignore code>.
code> entité puis crée une classe
userDoTo cod> et ajoutez le champ requis dans ce
userDo code> classe. p>
ModelMapper code> pour mapper l'utilisateur Entité to
userDto code> classe. Enfin, renvoyez cette classe utilisateurDo en tant qu'objet de réponse. P>
User user = new User();
UserDto userDto = new ModelMapper.map(user, UserDto.class);
Le moyen le plus simple est de contrôler la sérialisation à JSON via les annotations fournies par la bibliothèque JSON par défaut qui est Jackson.
https://fasterxml.github.io/jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/jsonignore.html p> Vous pouvez également le faire via un mixin Jackson pour éviter de "polluer" l'entité avec des instructions de traitement JSON. P> P>