java jsonproperty Seulement en utilisant @JsonIgnore pendant la sérialisation, mais pas la désérialisation




@jsonproperty access access write_only (4)

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

Comment puis-je 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 l' ObjectMapper .

Les choses que j'ai essayées:

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

Answer #1

Dans mon cas, Jackson a automatiquement sérialisé / désérialisé les objets que je reviens d'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 il n'a simplement rien fait.


Answer #2

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

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

Même si un accesseur 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 dans l'autre sens, utilisez simplement Access.READ_ONLY .


Answer #3
"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
                }

Answer #4

Pour ce faire, tout ce dont nous avons besoin est de deux annotations:

  1. @JsonIgnore
  2. @JsonProperty

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

Un exemple d'illustration aiderait à faire ceci:

class User{

// More fields here
 @JsonIgnore
 private String password;

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

 @JsonProperty
 public void setPassword(String password) {
    this.password = password;
 }
}




jackson