2012-11-20 30 views
4

我有一个简单的返回类,它需要一个异常或我们的一个业务对象。如果REST Web服务方法引发异常,它会捕获它并在响应中设置异常。如果不是,它会在响应中设置返回值并对其进行序列化。Gson StackOverflowError

在我的情况下,我得到一个InvocationTargetError,它包装了我们的一个服务异常。我把这个设置在我的例外返回类中,并得到以下堆栈跟踪:

java.lang.StackOverflowError 
com.google.gson.reflect.TypeToken.hashCode(TypeToken.java:280) 
java.util.HashMap.get(HashMap.java:300) 
java.util.Collections$SynchronizedMap.get(Collections.java:1975) 
com.google.gson.Gson.getAdapter(Gson.java:337) 
com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:55) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
and so on... 

任何有什么想法?这看起来像Gson 2.2.2中的一个bug。

+2

你确定没有循环引用吗? http://stackoverflow.com/questions/10209959/gson-tojson-throws-stackoverflowerror(那是发生在我身上的) – MartinK

+1

这是一个例外。什么是循环? – Thom

+1

抓我的头 - 原来Throwable的“原因”字段是问题所在。请参阅http://groups.google.com/forum/?fromgroups=#!topic/google-gson/hFpBXbudMRQ – MartinK

回答

5

GSON不能处理在序列化的数据循环引用。你有机会。修复这个问题,你已经解决了你的问题。

+0

原来所有异常都有循环引用。谁会抢劫它。无法弄清楚那一个。 – Thom

+0

那么,一个人如何“解决这个问题”?用户对象包含一个用户(你关注的人)的数组列表。 – Luc