2012-10-05 16 views
22

Sto usando Jackson e sto avendo dei problemi, quando provo a deserializzare un oggetto ottengo il seguente errore:non possono costruire istanza - Jackson

com.fasterxml.jackson.databind.JsonMappingException: 
    Can not construct instance of net.MyAbstractClass, 
    problem: abstract types either need to be mapped to concrete types, 
     have custom deserializer, or be instantiated with additional type information 

sto avendo problemi nel l'attributo:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT, property = "@id") 
@JsonSubTypes({ @JsonSubTypes.Type(value = MyAbstractClass.class, name = "MyAbstractClass") }) 
@ManyToOne 
private MyAbstractClass object; 

Qualcuno potrebbe aiutarmi?

+0

Un'altra discussione su un caso simile viene eseguita su https://stackoverflow.com/a/32777371/873282. Particolarmente interessante è il commento che afferma di usare '@JsonTypeInfo (use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property =" type ")'. In questo modo, il JSON è un po 'più grande, ma è esplicito, quale tipo dovrebbe essere usato. – koppor

risposta

24

Non è possibile instanciare una classe astratta, nemmeno Jackson. Si dovrebbe dare a Jackson informazioni su come istanziare MyAbstractClass con un tipo concreto.

Vedere questa risposta su StackOverflow: Jackson JSON library: how to instantiate a class that contains abstract fields

E forse anche vedere Jackson Polymorphic type handling

+2

Grazie per l'aiuto, ho risolto con: 'JsonTypeInfo.Id.NAME, includono = JsonTypeInfo.As.PROPERTY, property = "classe")' ' la property = "classe"', è in arrivo nella mia JSON informare quale classe verrà utilizzata. –

+1

Attenzione, consentendo agli utenti di specificare quale classe utilizzare durante la deserializzazione potrebbe portare a vulnerabilità come [this] (http://fishbowl.pastiche.org/2015/11/09/java_serialization_bug/). –

+0

Grazie per il riferimento: @JsonTypeInfo (use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class") fa il trucco. Come il valore del descriminatore della tabella JPA. Grazie. – 99Sono

6

vostra dichiarazione @JsonSubTypes non ha senso: ha bisogno di elencare implementazione classi (sotto), non la classe in sé (che avrebbe essere inutile). Quindi è necessario modificare quella voce per elencare le sottoclasse che ci sono; o utilizzare qualche altro meccanismo per registrare sottoclassi (SimpleModule ha qualcosa come addAbstractTypeMapping).

Problemi correlati