2011-09-15 15 views
5

Attualmente sto usando il jackson 1.7 che tenta di deserializzare un oggetto da una libreria di terze parti.Cosa c'è di sbagliato nella mia annotazione @JsonCreator e MixIn?

Così ho creato il mio ObjectMapper di usare la mia classe intermedia in questo modo:

ObjectMapper mapper = new ObjectMapper(); 
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    mapper.getDeserializationConfig().addMixInAnnotations(com.vividsolutions.jts.geom.Point.class, MixIn.class); 

E la mia classe intermedia annotato con @JsonCreator e con la logica per istanziare il Point oggetto ci

public class MixIn { 
private static final GeometryFactory geometryFactory = GeometryFactoryFactory.getGeometryFactory(); 

@JsonCreator 
public static Point createPoint(@JsonProperty("x")double x, @JsonProperty("y")double y) { 
    return geometryFactory.createPoint(new Coordinate(x, y)); 
}} 

Ma io sto ottenendo l'eccezione

No suitable constructor found for type [simple type, class com.vividsolutions.jts.geom.Point]: can not instantiate from JSON object (need to add/enable type information?) 

Il debug mostra che la mia classe MixIn non viene mai chiamata, ho pensato che doveva essere una classe concreta ma aveva lo stesso risultato.

Cosa sto sbagliando? Cosa c'è di sbagliato nella mia configurazione?

Grazie

risposta

6

il problema è nel presupposto che mix-ins sarebbero stati utilizzati per qualcosa di diverso l'aggiunta di annotazioni. Quindi nel tuo caso, l'annotazione per 'createPoint()' verrebbe aggiunta, ma a meno che la classe di destinazione non abbia il metodo factory corrispondente (per aggiungere annotazioni a), questo non avrà alcun effetto. In particolare, quindi, i mix-in non possono essere utilizzati per iniettare metodi statici di fabbrica; possono essere utilizzati solo per associare annotazioni a classi esistenti.

+0

grazie mille che abbia un senso, credo che la mia unica opzione è quella di serializzare tutte quelle altre qualità necessarie _ (circa 3 oggetti più complessi :() _ per la classe obiettivo costruttore e li uso nella classe MixIn. Ho ragione? – maverick

+0

Grazie ancora, ho finalmente finito di escludere il campo mentre la deserializzazione non è più necessaria. – maverick

+0

avere questo, o qualcosa di simile, sarebbe incredibilmente utile per una facile deserializzazione delle classi che non può essere modificato. Ci sono molti casi in cui la deserializzazione generale è troppo difficile. – loesak

0

Provare a utilizzare @JsonIgnoreProperties({"isMilestoneView", "milestoneId"}) classe livello di annotazione

Problemi correlati