2013-04-15 1 views
16

Ho una semplice interfaccia con getter e setter per una proprietà.Ignorare la proprietà durante la deserializzazione

public interface HasMoney { 

     Money getMoney(); 

     void setMoney(Money money); 

} 

Ho un altro UserAccount di classe che implementa questa interfaccia.

public class UserAccount implements HasMoney { 

     private Money money; 

     @Override 
     Money getMoney() // fill in the blanks 

     @Override 
     void setMoney(Money money) // fill in the blanks 

} 

Il mio problema è che voglio serializzare la proprietà soldi ma ignora durante la deserializzazione esso vale a dire, non accettiamo i valori da parte dell'utente per questa proprietà. Ho provato @JsonIgnore su setter e @JsonIgnore (false) sul getter, lo ignora ma lo fa anche durante la serializzazione.

Ho provato @JsonIgnore sul setter e @JsonProperty sul getter solo per dire esplicitamente a Jackson che intendiamo tenere traccia di questa proprietà, che sembra bloccare l'applicazione quando la proprietà money viene inviata al server e Jackson prova a deserializzarlo vomitare MalformedJsonException: impossibile costruire l'oggetto di tipo Money.

La cosa più bizzarra è che mettere @JsonIgnore sul setter e @JsonProperty sul setter funziona nella maggior parte dei casi quando la proprietà è primitiva.

risposta

10

Ok, quindi il comportamento di @JsonIgnore è stato modificato radicalmente dalla versione 1.9 in poi (per il caso peggiore). Senza entrare nei dettagli diabolici del perché la vostra proprietà non viene ignorare durante la deserializzazione, provare questo codice per risolvere il problema:

public class UserAccount implements HasMoney { 
    @JsonIgnore 
    private BigDecimal money; 

    // Other variable declarations, constructors 

    @Override 
    @JsonProperty 
    public BigDecimal getMoney() { 
     return money; 
    } 

    @JsonIgnore 
    @Override 
    public void setMoney(final BigDecimal money) { 
     this.money = money; 
    } 

    // Other getters/setters 
} 

Nota l'uso del @JsonIgnore sulla variabile di classe - la sua richiesta per una soluzione di lavoro.

Nota: a seconda dell'ambiente e dei casi d'uso, potrebbe essere necessario un'ulteriore configurazione sull'istanza ObjectMapper, per esempio, USE_GETTERS_AS_SETTERS, AUTO_DETECT_GETTERS, AUTO_DETECT_SETTERS ecc.

+1

Questo è in realtà parte della soluzione. Ho anche dovuto aggiungere objectMapper.disable (MapperFeature.USE_GETTERS_AS_SETTERS) e ha funzionato allora. Per favore modifica la tua risposta e io la accetterò. E 'triste che non ci sia un modo più pulito per questo (Atleast I non è stato in grado di trovarlo). –

+0

@NishantNagwani - dispari, funziona per me senza quella funzione abilitata. Sto aggiungendo una nota opzionale alla mia risposta, ma sono curioso di sapere se qualcosa è diverso nella tua configurazione che richiederebbe 'USE_GETTERS_AS_SETTERS'. – Perception

+0

L'ho provato di nuovo. Non funziona con il mio ambiente. Sto usando jackson 2.1.1. Ecco l'errore che ricevo { "message": "JSON non valido passato al server, tipo di dati errato utilizzato: \ nProblem deserializing 'setterless' property 'money': get metodo restituito null (attraverso la catena di riferimenti: com.abc. def.Money]) " } –

17

La versione 2.6.0+ consente di eseguire questa operazione con @JsonIgnoreProperties a livello di classe.

@JsonIgnoreProperties(value={ "money" }, allowGetters=true) 

Date un'occhiata a questo numero chiuso: https://github.com/FasterXML/jackson-databind/issues/95

+1

Questa soluzione è più pulita –