Ho una classe astratta denominata Instance
e quindi due implementazioni di quello, UserInstance
e HardwareInstance
. Il problema che sto avendo è che quando chiamo il resto dell'endpoint per un @POST
nel database, idealmente volevo che fosse come .../rest/soexample/instance/create
dove l'istanza è passata all'endpoint REST. Se Instance
non fosse astratto con più di un'implementazione, andrebbe bene, ma visto che ho 2 ho un errore Jackson.databind
.Deserializzazione Jackson su più tipi
"problema: tipi astratti sia bisogno di essere mappati a tipi concreti, hanno deserializzatore personalizzati, o essere istanziati con informazioni di tipo addizionale"
Dopo guardando una soluzione a questo ho trovato un SO risposta che ha detto potrei usare qualcosa come:
@JsonDeserialize(as=UserInstance.class)
Ma sembra del genere isonly utile se c'è un'implementazione della classe astratta. Supponendo che non posso chiamarlo due volte poiché non ci sarebbe modo di decidere quale tipo di istanza sarebbe.
Quindi mi chiedo quale sia il modo migliore per gestire questa situazione? Dovrei creare diversi endpoint? Come:
.../rest/soexample/userinstance/create
&
io non sono troppo sicuro come sono un paio di cose noobie @ REST correlati, anche se attivamente cercando di imparare. Grazie!
È possibile scrivere un deserializzatore personalizzato per quella classe astratta, che dovrebbe analizzare a livello di codice il JSON a seconda dei campi e analizzare il corpo come qualsiasi classe concreta che avevate in mente. – IanGabes
Grazie per il suggerimento. Non l'ho mai fatto prima. Dove posizionare il deserializzatore personalizzato? Come lo chiamerei dall'interno dell'endpoint per '.../rest/soexample/instance/create'? – erp
REST è un tipo di applicazione non specifico, non mi dice molto su quale tecnologia server/client si sta utilizzando. Ho trovato una domanda simile alla tua con la soluzione che avevo in mente: http://stackoverflow.com/questions/8210538/dynamic-polymorphic-type-handling-with-jackson Generalmente inserisco il deserializzatore come classe interna statica pubblica dell'oggetto che stai tentando di deserializzare. – IanGabes