J'ai une classe d'entité avec un champ de mot de passe:
class User {
private String password;
//setter, getter..
}
Je veux que ce champ soit ignoré lors de la sérialisation. Mais il devrait toujours être en mesure de DEsérialiser. Ceci est nécessaire pour que le client puisse m'envoyer un nouveau mot de passe, mais ne puisse pas lire le mot de passe actuel.
Comment puis-je accomplir cela avec Jackson?
@JsonIgnore
getter, mais un@JsonProperty
setter, auquel cas les choses ne sont pas sérialisées, mais peuvent être désérialisées.Réponses:
Vous pouvez le marquer comme
@JsonIgnore
.Avec 1.9, vous pouvez ajouter
@JsonIgnore
pour getter,@JsonProperty
pour setter, pour le désérialiser mais pas le sérialiser.la source
@JsonIgnore
pour getter,@JsonProperty
pour setter, pour le désérialiser mais pas le sérialiser.transient
(comme dansprivate transient String password;
), mais les champs transitoires avec des getters publics sont ignorés sauf si MapperFeature.PROPAGATE_TRANSIENT_MARKER est activé.Illustrant ce que StaxMan a déclaré, cela fonctionne pour moi
la source
@JsonIgnore
n'est pas nécessaire sur le terrain, semble-t-il.Le moyen le plus simple est d'annoter vos getters et setters.
Voici l'exemple original modifié pour exclure le mot de passe en texte brut, mais annoter une nouvelle méthode qui renvoie simplement le champ de mot de passe sous forme de texte chiffré.
la source
À partir de Jackson 2.6 , une propriété peut être marquée en lecture ou en écriture seule. C'est plus simple que de pirater les annotations sur les deux accesseurs et de conserver toutes les informations au même endroit:
la source
En plus
@JsonIgnore
, il y a quelques autres possibilités:@JsonIgnoreProperties
en classe peut être utilela source
transient
est la solution pour moi. Merci! il est natif de Java et vous évite d'ajouter une autre annotation spécifique au framework.la source
On devrait se demander pourquoi vous voudriez une méthode publique getter pour le mot de passe. Hibernate, ou tout autre framework ORM, fera l'affaire avec une méthode getter privée. Pour vérifier si le mot de passe est correct, vous pouvez utiliser
la source
Jackson a une classe nommée SimpleBeanPropertyFilter qui permet de filtrer les champs pendant la sérialisation et la désérialisation; pas globalement. Je pense que c'est ce que tu voulais.
Puis dans votre code:
Cela empêchera le
password
champ d'être sérialisé. Vous pourrez également désérialiser lespassword
champs tels quels . Assurez-vous simplement qu'aucun filtre n'est appliqué sur l'objet ObjectMapper.la source
définir la variable comme
@JsonIgnore
Cela permet à la variable d'être ignorée par le sérialiseur json
la source