it-swarm.com.de

Verwenden Sie @JsonIgnore nur während der Serialisierung, nicht jedoch während der Deserialisierung

Ich habe ein Benutzerobjekt, das zum und vom Server gesendet wird. Wenn ich das Benutzerobjekt aussende, möchte ich das Hash-Passwort nicht an den Client senden. Also habe ich @JsonIgnore in die password -Eigenschaft eingefügt, aber dies verhindert auch, dass sie in das Passwort deserialisiert wird, was es schwierig macht, Benutzer zu registrieren, wenn sie kein Passwort haben.

Wie kann ich @JsonIgnore nur für die Serialisierung und nicht für die Deserialisierung verwenden? Da ich Spring JSONView verwende, habe ich nicht viel Kontrolle über ObjectMapper.

Dinge, die ich versucht habe:

  1. Fügen Sie der Eigenschaft @JsonIgnore hinzu
  2. Fügen Sie @JsonIgnore nur bei der Getter-Methode hinzu
281
chubbsondubs

Wie dies genau funktioniert, hängt von der Version von Jackson ab, die Sie verwenden. Dies änderte sich um Version 1.9 herum. Zuvor konnten Sie dies tun, indem Sie @JsonIgnore zum Getter hinzufügten.

Was du ausprobiert hast:

Fügen Sie @JsonIgnore nur für die Getter-Methode hinzu

Führen Sie dies aus, und fügen Sie außerdem eine bestimmte @JsonProperty -Anmerkung für Ihren JSON-Feldnamen "password" zur Setter-Methode für das Kennwort für Ihr Objekt hinzu .

In neueren Versionen von Jackson wurden READ_ONLY und WRITE_ONLY Anmerkungsargumente für JsonProperty hinzugefügt. Sie können also auch Folgendes tun:

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

Dokumente finden Sie hier .

418
pb2q

Dazu benötigen wir lediglich zwei Anmerkungen:

  1. @JsonIgnore
  2. @JsonProperty

Verwenden Sie @JsonIgnore für Klassenmitglieder und deren Getter. Verwenden Sie @JsonProperty für den Setter.

Eine Beispielillustration würde dazu beitragen:

class User{

// More fields here
 @JsonIgnore
 private String password;

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

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

Ab Version 2.6: Intuitiver ist es, die Anmerkung com.fasterxml.jackson.annotation.JsonProperty auf dem Feld zu verwenden:

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

Selbst wenn ein Getter vorhanden ist, wird der Feldwert von der Serialisierung ausgeschlossen.

JavaDoc sagt:

/**
 * 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

Wenn Sie es andersherum brauchen, verwenden Sie einfach Access.READ_ONLY.

69
Daniel Beer

In meinem Fall hat Jackson Objekte, die ich von einem Spring MVC-Controller zurückgebe, automatisch serialisiert/deserialisiert (ich verwende @RestController mit Spring 4.1.6). Ich musste com.fasterxml.jackson.annotation.JsonIgnore anstelle von org.codehaus.jackson.annotate.JsonIgnore verwenden, sonst hat es einfach nichts getan.

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