Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

gson.toJson() throws StackOverflowError

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?

like image 315
nimrod Avatar asked Apr 18 '12 13:04

nimrod


1 Answers

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; 
like image 196
SLaks Avatar answered Sep 28 '22 03:09

SLaks