N’utilise que @JsonIgnore pendant la sérialisation, mais pas la désérialisation

J’ai un object utilisateur qui est envoyé vers et depuis le serveur. Lorsque je envoie l’object utilisateur, je ne souhaite pas envoyer le mot de passe haché au client. J’ai donc ajouté @JsonIgnore à la propriété password, mais cela l’ @JsonIgnore d’être désérialisé dans le mot de passe, ce qui rend difficile l’inscription des utilisateurs lorsqu’ils n’ont pas de mot de passe.

Comment puis-je obtenir seulement @JsonIgnore à appliquer à la sérialisation et non à la désérialisation? J’utilise Spring JSONView donc je n’ai pas beaucoup de contrôle sur ObjectMapper .

Les choses que j’ai essayées:

  1. Ajouter @JsonIgnore à la propriété
  2. Ajouter @JsonIgnore sur la méthode getter

Exactement comment faire cela dépend de la version de Jackson que vous utilisez. Cela a changé autour de la version 1.9 , avant cela, vous pouviez le faire en ajoutant @JsonIgnore au getter.

Ce que vous avez essayé:

Ajouter @JsonIgnore uniquement sur la méthode getter

Pour ce faire, ajoutez également une annotation @JsonProperty spécifique pour votre nom de champ JSON “mot de passe” à la méthode setter pour le mot de passe de votre object.

Des versions plus récentes de Jackson ont ajouté des arguments d’annotation READ_ONLY et WRITE_ONLY pour JsonProperty . Vous pouvez donc aussi faire quelque chose comme:

 @JsonProperty(access = Access.WRITE_ONLY) private Ssortingng password; 

Les documents peuvent être trouvés ici .

Pour ce faire, il suffit de deux annotations:

  1. @JsonIgnore
  2. @JsonProperty

Utilisez @JsonIgnore sur le membre de la classe et son getter. Utilisez @JsonProperty sur son setter.

Un exemple d’illustration aiderait à faire ceci:

 class User{ // More fields here @JsonIgnore private Ssortingng password; @JsonIgnore public Ssortingng getPassword() { return password; } @JsonProperty public void setPassword(Ssortingng password) { this.password = password; } } 

Depuis la version 2.6: une manière plus intuitive consiste à utiliser l’annotation com.fasterxml.jackson.annotation.JsonProperty sur le champ:

 @JsonProperty(access = Access.WRITE_ONLY) private Ssortingng myField; 

Même si un getter existe, la valeur du champ est exclue de la sérialisation.

JavaDoc dit:

 /** * Access setting that means that the property may only be written (set) * for deserialization, * but will not be read (get) on serialization, that is, the value of the property * is not included in serialization. */ WRITE_ONLY 

Au cas où vous en auriez besoin, utilisez simplement Access.READ_ONLY .

Dans mon cas, j’ai Jackson sérialiser / désérialiser automatiquement les objects que je renvoie depuis un contrôleur Spring MVC (j’utilise @RestController avec Spring 4.1.6). J’ai dû utiliser com.fasterxml.jackson.annotation.JsonIgnore au lieu de org.codehaus.jackson.annotate.JsonIgnore , sinon cela n’a tout simplement rien fait.

 "user": { "firstName": "Musa", "lastName": "Aliyev", "email": "klaudi2012@gmail.com", "passwordIn": "98989898", (or encoded version in front if we not using https) "country": "Azeribaijan", "phone": "+994707702747" } 

 @CrossOrigin(methods=RequestMethod.POST) @RequestMapping("/public/register") public @ResponseBody MsgKit registerNewUsert(@RequestBody User u){ root.registerUser(u); return new MsgKit("registered"); } 

 @Service @Transactional public class RootBsn { @Autowired UserRepository userRepo; public void registerUser(User u) throws Exception{ u.setPassword(u.getPasswordIn()); //Generate some salt and setPassword (encoded - salt+password) User u=userRepo.save(u); System.out.println("Registration information saved"); } } 

  @Entity @JsonIgnoreProperties({"recordDate","modificationDate","status","createdBy","modifiedBy","salt","password"}) public class User implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; private Ssortingng country; @Column(name="CREATED_BY") private Ssortingng createdBy; private Ssortingng email; @Column(name="FIRST_NAME") private Ssortingng firstName; @Column(name="LAST_LOGIN_DATE") private Timestamp lastLoginDate; @Column(name="LAST_NAME") private Ssortingng lastName; @Column(name="MODIFICATION_DATE") private Timestamp modificationDate; @Column(name="MODIFIED_BY") private Ssortingng modifiedBy; private Ssortingng password; @Transient private Ssortingng passwordIn; private Ssortingng phone; @Column(name="RECORD_DATE") private Timestamp recordDate; private Ssortingng salt; private Ssortingng status; @Column(name="USER_STATUS") private Ssortingng userStatus; public User() { } // getters and setters }