web-dev-qa-db-fra.com

Utiliser uniquement @JsonIgnore pendant la sérialisation, mais pas la désérialisation

J'ai un objet utilisateur qui est envoyé vers et depuis le serveur. Lorsque j'envoie l'objet utilisateur, je ne souhaite pas envoyer le mot de passe haché au client. J'ai donc ajouté @JsonIgnore à la propriété password, mais cela empêche également la désérialisation en mot de passe, ce qui complique l'inscription des utilisateurs qui n'ont pas de mot de passe.

Comment puis-je seulement obtenir que @JsonIgnore s'applique à la sérialisation et non à la désérialisation? J'utilise Spring JSONView pour ne pas avoir beaucoup de contrôle sur le ObjectMapper.

Choses que j'ai essayées:

  1. Ajouter @JsonIgnore à la propriété
  2. Ajouter @JsonIgnore sur la méthode de lecture uniquement
281
chubbsondubs

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

Que vous avez essayé:

Ajoutez @JsonIgnore à la méthode de lecture uniquement

Faites ceci et aussi ajoutez une annotation @JsonProperty spécifique pour votre nom de champ "mot de passe" JSON à la méthode setter pour le mot de passe de votre objet. .

Des versions plus récentes de Jackson ont ajouté les arguments d'annotation READ_ONLY et WRITE_ONLY pour JsonProperty. Donc, vous pouvez aussi faire quelque chose comme:

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

Les documents peuvent être trouvés ici .

418
pb2q

Pour ce faire, nous avons besoin de deux annotations:

  1. @JsonIgnore
  2. @JsonProperty

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

Voici un exemple d’illustration:

class User{

// More fields here
 @JsonIgnore
 private String password;

 @JsonIgnore
 public String getPassword() {
    return password;
 }

 @JsonProperty
 public void setPassword(String 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 String myField;

Même s'il existe un getter, 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

Si vous en avez besoin dans l'autre sens, utilisez simplement Access.READ_ONLY.

69
Daniel Beer

Dans mon cas, Jackson a la sérialisation/désérialisation automatique des objets que je retourne d'un contrôleur Spring MVC (j'utilise @RestController avec Spring 4.1.6). Je devais utiliser com.fasterxml.jackson.annotation.JsonIgnore au lieu de org.codehaus.jackson.annotate.JsonIgnore, sinon cela ne ferait tout simplement rien.

11
Alex Beardsley
"user": {
        "firstName": "Musa",
        "lastName": "Aliyev",
        "email": "[email protected]",
        "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 String country;

                        @Column(name="CREATED_BY")
                        private String createdBy;

                        private String email;

                        @Column(name="FIRST_NAME")
                        private String firstName;

                        @Column(name="LAST_LOGIN_DATE")
                        private Timestamp lastLoginDate;

                        @Column(name="LAST_NAME")
                        private String lastName;

                        @Column(name="MODIFICATION_DATE")
                        private Timestamp modificationDate;

                        @Column(name="MODIFIED_BY")
                        private String modifiedBy;

                        private String password;

                        @Transient
                        private String passwordIn;

                        private String phone;

                        @Column(name="RECORD_DATE")
                        private Timestamp recordDate;

                        private String salt;

                        private String status;

                        @Column(name="USER_STATUS")
                        private String userStatus;

                        public User() {
                        }
                // getters and setters
                }
2
Musa