Solo con @JsonIgnore durante la serializzazione, ma non con la deserializzazione

Ho un object utente che viene inviato al e dal server. Quando invio l’object utente, non voglio inviare la password con hash al client. Quindi ho aggiunto @JsonIgnore sulla proprietà della password, ma questo impedisce anche di essere deserializzato nella password, il che rende difficile iscriversi agli utenti quando non hanno una password.

Come posso ottenere @JsonIgnore solo per applicare la serializzazione e non la deserializzazione? Sto usando Spring JSONView, quindi non ho un sacco di controllo su ObjectMapper .

Cose che ho provato:

  1. Aggiungi @JsonIgnore alla proprietà
  2. Aggiungi @JsonIgnore sul metodo getter

Esattamente come farlo dipende dalla versione di Jackson che stai usando. Ciò è cambiato attorno alla versione 1.9 , prima di ciò, è ansible farlo aggiungendo @JsonIgnore al getter.

Che hai provato:

Aggiungi @JsonIgnore solo sul metodo getter

Fai questo e aggiungi anche un’annotazione specifica @JsonProperty per il tuo nome di campo “password” JSON al metodo setter per la password sul tuo object.

Le versioni più recenti di Jackson hanno aggiunto READ_ONLY argomenti di annotazione READ_ONLY e WRITE_ONLY per JsonProperty . Quindi potresti anche fare qualcosa del tipo:

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

I documenti possono essere trovati qui .

Per fare ciò, tutto ciò di cui abbiamo bisogno sono due annotazioni:

  1. @JsonIgnore
  2. @JsonProperty

Usa @JsonIgnore sul membro della class e il suo getter. Usa @JsonProperty sul suo setter.

Un’illustrazione di esempio potrebbe aiutare a fare questo:

 class User{ // More fields here @JsonIgnore private String password; @JsonIgnore public String getPassword() { return password; } @JsonProperty public void setPassword(String password) { this.password = password; } } 

Dalla versione 2.6: un modo più intuitivo è usare l’annotazione com.fasterxml.jackson.annotation.JsonProperty sul campo:

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

Anche se esiste un getter, il valore del campo è escluso dalla serializzazione.

JavaDoc dice:

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

Nel caso in cui ne hai bisogno viceversa, usa Access.READ_ONLY .

Nel mio caso ho Jackson serializzare / deserializzare automaticamente oggetti che torno da un controller Spring MVC (sto usando @RestController con Spring 4.1.6). Ho dovuto usare com.fasterxml.jackson.annotation.JsonIgnore invece di org.codehaus.jackson.annotate.JsonIgnore , altrimenti semplicemente non ha fatto nulla.

 "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 }