/ / json jackson encoding - StackOverflowError - java, json, jackson, hl7-fhir

codifica json jackson - StackOverflowError - java, json, jackson, hl7-fhir

Sto cercando di convertire un oggetto java in una stringa json e fallisce con uno StackoverflowError, probabilmente a causa di un loop / ciclo inifinito negli oggetti secondari dell'oggetto.

    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:505)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:639)
Caused by: java.lang.StackOverflowError
at java.lang.ClassLoader.defineClass1(Native Method)
...
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:655)

L'oggetto che sto cercando di codificare è un'istanza di una classe di cui non ho il controllo. Posso solo sottoclassi. Penso che dovrei essere in grado di aggiungere @JsonIgnore sul campo colpevole (intendo nel corrispondente metodo getter sovrascritto) ma non so quale sia, sono classi enormi con centinaia di campi e sotto oggetti.

C'è un modo semplice per sapere quale campo sta causando il loop infinito nella codifica JSON?

PS: per chi ha familiarità con esso, è il Patient classe del framework HL7 HAPI FHIR. So che esiste un serializzatore json personalizzato che viene fornito con quel framework, ma ho bisogno di usare il jackson più generico per sfruttare alcune delle sue funzionalità.

Grazie molto

risposte:

0 per risposta № 1

Questo accadrà se il tuo oggetto grafico ha adipendenza circolare. Non c'è un modo davvero semplice per conoscere il ciclo. È possibile ignorare tutto, quindi reintrodurre i campi in lotti e vedere dove si interrompe.

Se stai sottoclassi semplicemente per annotare con @Ignore, dovresti dare un'occhiata Jackson mixins


0 per risposta № 2

Di solito l'eccezione dovrebbe comunque includere il grafo di inclusione (i nomi delle proprietà attraverso cui è formato il ciclo); non è questo il caso qui?