尝试将异常对象转换为Json文本时出现异常

时间:2012-12-26 13:02:49

标签: java gson

我有这个例外

Caused by: java.lang.StackOverflowError
    at java.util.ArrayList.get(ArrayList.java:322)[:1.6.0_12]
    at com.google.gson.stream.JsonWriter.peek(JsonWriter.java:354)

尝试将Exception对象转换为Json Text时,如下面的代码

Exception exception = new Exception("Test");    
String gsonText = gson.toJson(exception);   

1 个答案:

答案 0 :(得分:2)

你得到一个StackOverflowError,因为异常的cause实例成员变量被初始化为它自己。序列化程序尝试遍历对象并且永远不会完成,因为它始终遵循对原因的引用。

有一个message on the GSON google group describing this problem,建议的解决方案是:

  

所以,你有三个(独家)选择:

     

1)如果您要序列化自己的例外,请修改所有例外   将cause设置为null或传递参数的异常   构建。

     

2)对任何返回的异常调用initCause(null)   来自getCause()的(null)(最终可能会得到一些IllegalStateExceptions   在这里)

     

3)编写自己的Serializer,调用getCause()   而不是试图取消引用“原因”字段。

     

此外,尝试通过线路发送序列化的异常代码可能   有点像非正统的设计选择。

通常,对应用程序开发人员的建议是不向客户端显示堆栈跟踪,因此我建议在异常上调用toString,或者将异常映射到服务器端的消息并发送消息。