2010-06-25 16 views
8

Attualmente sto utilizzando Jackson 1.4.2 e sto tentando di deserializzare i valori code (identificatori univoci per le informazioni sul tipo) che vengono passati dall'interfaccia utente ai controller Java (Servlet).Jackson non riconosce l'annotazione @JsonCreator

Ci sono diversi tipi (ad esempio ABCType, XYZType, etc.) che tutti si estendono da un AbstractType, ma ogni tipo di cemento ha un metodo factory statico che prende come unico parametro, un identificatore univoco, e restituisce l'oggetto tipo (nome, tipi associati, descrizione, acronimi validi, ecc.) rappresentati da tale identificatore. Il metodo statico all'interno di ogni tipo concreto (ad esempio XYZType) è annotata con @JsonCreator:

@JsonCreator 
public static XYZType getInstance(String code) { 
    ..... 
} 

Il problema che sto vedendo se è un'eccezione lanciata da mapper di Jackson cercando di deserializzare il JSON a quei tipi:

Causato da: org.codehaus.jackson.map.JsonMappingException: Nessun costruttore predefinito trovato per tipo [tipo semplice, classe com.company.type.XYZtype]: impossibile creare un'istanza dall'oggetto Json.

Quello che mi manca qui del @JsonCreator annotazione metodi factory statici (o è a che fare con Jackson 1.4.2 prese con i tipi concreti che si estendono da un AbstractType?)?

risposta

12

L'annotazione @JsonCreator richiede l'annotazione @JsonProperty. Questo Jackson wiki page dà poche informazioni ma offre codice di esempio:

@JsonCreator 
public Name(@JsonProperty("givenName") String g, @JsonProperty("familyName") String f) 
{ 
    givenName = g; 
    familyName = f; 
} 

troverete una spiegazione più dettagliata a this blog post.

Il codice di esempio dovrebbe quindi essere simile a questa:

@JsonCreator 
public static XYZType getInstance(@JsonProperty("someCode") String code) 
{ 
... 
} 
4

Il problema è che Jackson vede solo il tipo di base dichiarato e non sa dove cercare i sottotipi. Poiché la gestione completa del tipo polimorfico è stata aggiunta in 1.5, è necessario aggiungere il metodo factory nella classe base e i metodi di invio da lì.

Problemi correlati