2015-02-05 16 views
8

ho una classe come questa:Configurare Jackson a un'eccezione quando un campo manca

public class Person { 
    private String name; 
    public String getName(){ 
    return name; 
    } 
} 

Sto utilizzando un ObjectMapper configurato in questo modo:

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

ho una stringa str che contiene questo { "address" : "something" }. Si noti che non esiste un campo "nome" in JSON. Se faccio qualcosa del genere:

mapper.readValue(str, Person.class); 

quindi effettivamente restituisco un oggetto Persona con il nome impostato su null. C'è un modo per configurare il mapper per lanciare un'eccezione, o restituire un riferimento nullo invece di una Persona? Voglio che Jackson consideri i campi mancanti un errore e non voglia fare controlli nulli espliciti sui campi dell'oggetto risultante.

risposta

1

Purtroppo questo non è supportato da Jackson in questo momento.

La soluzione potrebbe essere quella di aggiungere la convalida nel costruttore. Idealmente se non vuoi che quei valori siano serializzati come null, vuol dire che non dovresti averli come null (costruiti in altro modo). Ad esempio,

public class Person { 
    private String name; 
    public Person() { 
    checkNotNull(name); 
    } 
} 

tuttavia questo potrebbe non fittable in tutte le situazioni, specialmente se si sta utilizzando il vostro oggetto se non attraverso la serializzazione/deserializzazione.

Sebbene abbiano l'attributo required nell'annotazione @JsonProperty, non è supportato affatto durante la deserializzazione ed è stato introdotto solo per la decorazione di schemi JSON. Vedere questo topic

+0

questo non ha funzionato. Sto cercando di farlo fallire sulle proprietà mancanti invece di impostarle su null. Non voglio che fallisca su proprietà sconosciute. – mushroom

+0

Scusa, non era chiaro. Ho modificato la risposta. – vtor

14

Come di Jackson 2.6, ci is a way, ma non funziona su classe di attribuire annotazioni, solo annotazioni costruttore:

/* DOES *NOT* THROW IF bar MISSING */ 
public class Foo {  
    @JsonProperty(value = "bar", required = true) 
    public int bar; 
} 

/* DOES THROW IF bar MISSING */ 
public class Foo { 
    public int bar; 
    @JsonCreator 
    public Foo(@JsonProperty(value = "bar", required = true) int bar) { 
     this.bar = bar; 
    } 
} 
+0

Lancia un'eccezione se non è richiesta e manca? – aclokay

+0

Sembra che '@ JsonCreator' non sia necessario per precedere il costruttore. (?) –

Problemi correlati