Gson StackOverflowError

4

我有一个简单的返回类,可以接受异常或我们的业务对象之一。如果REST web服务方法抛出异常,它会捕获并在响应中设置异常。否则,它会在响应中设置返回值并对其进行序列化。

在我的情况下,我遇到了一个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
你确定没有循环引用了吗?https://dev59.com/UWkv5IYBdhLWcg3w_lvE (这就是我遇到的问题) - MartinK
1
这是一个异常情况。什么会是循环的? - Thom
1
我正在思考 - 结果发现 Throwable 的 cause 字段是问题所在。请参阅 http://groups.google.com/forum/?fromgroups=#!topic/google-gson/hFpBXbudMRQ - MartinK
2个回答

6

Gson无法处理序列化数据中的循环引用。很有可能你遇到了这个问题。解决循环引用问题即可解决此问题。


原来所有的异常都有循环引用。谁能想到呢?我也搞不清楚这个问题。 - Thom
1
那么如何“修复”这个问题呢?用户对象包含一个用户数组列表(你关注的人),这是一种设计方式。 - Luc

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接