446 Stimmen

Nur Verwendung von @JsonIgnore bei der Serialisierung, aber nicht bei der Deserialisierung

Ich habe ein Benutzerobjekt, das zum und vom Server gesendet wird. Wenn ich das Benutzerobjekt versende, möchte ich das gehashte Kennwort nicht an den Client senden. Ich habe also hinzugefügt @JsonIgnore auf die Kennworteigenschaft, aber dies verhindert auch, dass es in das Kennwort deserialisiert wird, was es schwierig macht, Benutzer anzumelden, wenn sie kein Kennwort haben.

Wie kann ich nur @JsonIgnore auf die Serialisierung und nicht auf die Deserialisierung anzuwenden? Ich verwende Spring JSONView, also habe ich keine große Kontrolle über die ObjectMapper .

Dinge, die ich ausprobiert habe:

  1. hinzufügen @JsonIgnore zum Grundstück
  2. hinzufügen @JsonIgnore nur bei der Getter-Methode

3voto

Musa Punkte 2450
"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 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
                }

2voto

Kedar Gokhale Punkte 31

Sie können @JsonIgnoreProperties auf Klassenebene verwenden und die Variablen, die Sie in Json igonre wollen, in den "value"-Parameter setzen, was bei mir gut funktioniert hat.

@JsonIgnoreProperties(value = { "myVariable1","myVariable2" })
public class MyClass {
      private int myVariable1;,
      private int myVariable2;
}

2voto

Sie können auch so vorgehen:

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

Es hat bei mir funktioniert

1voto

Collin Krawll Punkte 1662

Ich habe nach etwas Ähnlichem gesucht. Ich wollte immer noch meine Eigenschaft serialisiert, aber wollte den Wert mit einem anderen Getter ändern. Im folgenden Beispiel deserialisiere ich das echte Kennwort, serialisiere es aber zu einem maskierten Kennwort. So geht's:

public class User() {

    private static final String PASSWORD_MASK = "*********";

    @JsonIgnore
    private String password;

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    public String setPassword(String password) {
        if (!password.equals(PASSWORD_MASK) {
            this.password = password;
        }
    }

    public String getPassword() {
        return password;
    }

    @JsonProperty("password")
    public String getPasswordMasked() {
        return PASSWORD_MASK;
    }
}

-2voto

vi0 Punkte 159

Die ideale Lösung wäre die Verwendung von DTO (Data Transfer Object)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X