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:
@JsonIgnore
à la propriété@JsonIgnore
sur la méthode de lecture uniquementCela 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 .
Pour ce faire, nous avons besoin de deux annotations:
@JsonIgnore
@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
.
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.
"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
}