Domanda

Attualmente sto usando Jackson 1.4.2 e il tentativo deserializzazione di valori code (identificatori unici per le informazioni sul tipo) che sono passati dalla nostra UI di nuovo ai controllori Java (Servlet).

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, etc.) rappresentate da tale identificatore. Il metodo statico all'interno di ogni tipo di cemento (ad es XYZType) viene annotato 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 per quei tipi:

  

Causato da: org.codehaus.jackson.map.JsonMappingException: Nessun costruttore predefinito trovato per il tipo [tipo semplice, classe com.company.type.XYZtype]:. Non può instantiate da oggetto JSON

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

È stato utile?

Soluzione

Il @JsonCreator annotazione richiede l'@JsonProperty annotazione. Questa pagina wiki href="http://wiki.fasterxml.com/JacksonFeatureCreators"> Jackson dà poche informazioni, ma non il codice dell'offerta di esempio:

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

Troverete una spiegazione più dettagliata a questo post del blog .

Il codice di esempio dovrebbe quindi essere simile a questa:

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

Altri suggerimenti

Il problema è che Jackson vede solo il tipo di base dichiarata, e non sa dove cercare sottotipi. Dal momento che la gestione completa tipo polimorfico è stato aggiunto nella 1.5, che cosa dovete fare con 1.4 è quello di aggiungere metodo factory nei metodi della classe base e spedizione da lì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top