I would like to generate a JSON String from my object:
Gson gson = new Gson(); String json = gson.toJson(item); Everytime I try to do this, I get this error:
14:46:40,236 ERROR [[BomItemToJSON]] Servlet.service() for servlet BomItemToJSON threw exception java.lang.StackOverflowError     at com.google.gson.stream.JsonWriter.string(JsonWriter.java:473)     at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:347)     at com.google.gson.stream.JsonWriter.value(JsonWriter.java:440)     at com.google.gson.internal.bind.TypeAdapters$7.write(TypeAdapters.java:235)     at com.google.gson.internal.bind.TypeAdapters$7.write(TypeAdapters.java:220)     at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:200)     at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)     at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)     at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60)     at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:843) These are the attributes of my BomItem class:
private int itemId; private Collection<BomModule> modules; private boolean deprecated; private String partNumber; private String description; //LOB private int quantity; private String unitPriceDollar; private String unitPriceEuro; private String discount;  private String totalDollar; private String totalEuro; private String itemClass; private String itemType; private String vendor; private Calendar listPriceDate; private String unitWeight; private String unitAveragePower; private String unitMaxHeatDissipation; private String unitRackSpace; Attributes of my referenced BomModule class:
private int moduleId; private String moduleName; private boolean isRootModule; private Collection<BomModule> parentModules; private Collection<BomModule> subModules; private Collection<BomItem> items; private int quantity; Any idea what causes this error? How can I fix it?
That problem is that you have a circular reference.
In the BomModule class you are referencing to:
private Collection<BomModule> parentModules; private Collection<BomModule> subModules; That self reference to BomModule, obviously, not liked by GSON at all.
A workaround is just set the modules to null to avoid the recursive looping. This way I can avoid the StackOverFlow-Exception.
item.setModules(null); Or mark the fields you don't want to show up in the serialized json by using the transient keyword, eg:
private transient Collection<BomModule> parentModules; private transient Collection<BomModule> subModules; If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With