2013-04-15 16 views
16

Ich habe eine einfache Schnittstelle mit Getter und Setter für eine Eigenschaft.Ignorieren Eigenschaft beim Deserialisieren

Ich habe eine andere Klasse UserAccount, die diese Schnittstelle implementiert.

public class UserAccount implements HasMoney { 

     private Money money; 

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

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

} 

Mein Problem ist, dass ich das Geld Eigenschaft serialisiert werden wollen, aber ignorieren, während es heißt Deserialisieren sind, tragen zu diesem Objekt keine Werte vom Benutzer akzeptieren. Ich habe versucht, @ JsonIgnore auf Setter und @ JsonIgnore (false) auf dem Getter, es ignoriert es, aber es tut dies, während es auch serialisieren.

Ich versuchte @JsonIgnore auf dem Setter und @JsonProperty auf dem Getter, nur Jackson ausdrücklich zu sagen, dass wir diese Eigenschaft verfolgen wollen, die die Anwendung abstürzt, wenn Geld Eigentum an den Server gesendet wird und Jackson versucht es zu deserialisieren MalformedJsonException hochwerfen: kann kein Objekt des Typs Money erstellen.

Die seltsamste Sache ist, dass @ JsonIgnore auf den Setter und @ JsonProperty auf den Setter funktioniert in den meisten Fällen, wenn die Eigenschaft primitiv ist.

Antwort

10

Ok, also wurde das Verhalten von @JsonIgnore ab 1.9 radikal verändert (zum schlechteren imo). Ohne auf die teuflischen Details, warum ist Ihr Eigentum nicht während der Deserialisierung ignorieren wird, versuchen Sie diesen Code, es zu beheben:

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 
} 

Beachten Sie die Verwendung von @JsonIgnore auf der Klassenvariable - sein für eine Arbeitslösung erforderlich.

Hinweis: Je nach Umgebung und Anwendungsfall kann auf Ihrer ObjectMapper Instanz zusätzliche Konfiguration benötigen, beispielsweise USE_GETTERS_AS_SETTERS, AUTO_DETECT_GETTERS, AUTO_DETECT_SETTERS etc.

+1

Dies ist eigentlich ein Teil der Lösung ist. Ich musste auch objectMapper.disable (MapperFeature.USE_GETTERS_AS_SETTERS) hinzufügen und es funktionierte dann. Bitte editiere deine Antwort und ich werde sie akzeptieren. Es ist traurig, dass es keinen saubereren Weg dazu gibt (ich konnte es nicht finden). –

+0

@NishantNagwani - ungerade, funktioniert für mich ohne diese Funktion aktiviert. Ich füge eine optionale Anmerkung zu meiner Antwort hinzu, aber ich bin gespannt, ob etwas an Ihrer Einrichtung anders ist, was 'USE_GETTERS_AS_SETTERS' erforderlich machen würde. – Perception

+0

Ich habe es noch einmal versucht. Funktioniert nicht mit meiner Umgebung. Ich benutze Jackson 2.1.1. Hier ist der Fehler, den ich bekomme { { "Nachricht": "Malformed JSON an den Server übergeben, falsche Datentyp verwendet: \ nProblem Deserialisierung 'Setterless' Eigenschaft 'Geld': Get-Methode zurückgegeben Null (durch Referenzkette: com.abc. def.Money]) " } –

17

Version 2.6.0+ ermöglicht dies mit @ JsonIgnoreProperties auf Klassenebene getan werden.

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

Werfen Sie einen Blick auf diese geschlossene Frage: https://github.com/FasterXML/jackson-databind/issues/95

+1

Diese Lösung ist sauberer –

Verwandte Themen