【发布时间】:2015-09-07 08:38:24
【问题描述】:
我将RoboSpice 与 GsonSpringAndroidSpiceService 一起使用。我也想加Realm来保存数据。
问题在于,在领域中每个对象都必须扩展领域对象,但 roboSpice 中的 gson 试图解析领域对象而不是忽略它。
我尝试添加排除策略:
Gson gson = new GsonBuilder() .setExclusionStrategies(new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes f) { return f.getDeclaringClass().equals(RealmObject.class); } @Override public boolean shouldSkipClass(Class<?> clazz) { return false; } }) .create();
然后
GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter(gson);
还尝试(单独)将@expose 添加到对象中的字段,并且
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
在两种情况下我有同样的错误:
09-07 11:21:04.615 8443-8443/com.mm.rsApp D/OpenGLRenderer: 启用调试模式 0 09-07 11:21:04.620 8443-8443/com.mm.rsApp D//SpiceManager.java:1018: 11:21:04.625 main 绑定到服务:GsonSpiceService 09-07 11:21:04.625 8443-8466/com.mm.rsApp D//SpiceManager.java:1133: 11:21:04.628 Thread-16362 Bound ok。 09-07 11:21:04.690 8443-8443/com.mm.rsApp I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@41b8f088 time:525639153 09-07 11:21:21.890 8443-8466/com.mm.rsApp D//SpiceManager.java:245: 11:21:21.896 Thread-16362 向服务发送请求:CachedSpiceRequest 09-07 11:21:21.895 8443-8466/com.mm.rsApp D//RequestProcessor.java:70: 11:21:21.898 Thread-16362 将请求添加到队列 1103121632: CachedSpiceRequest [requestCacheKey=login, cacheDuration=-1 , spiceRequest=com.mm.rsApp.requests.BaseRequest@41d700c0] 大小为 0 09-07 11:21:21.900 8443-8466/com.mm.rsApp D//RequestProcessor.java:89: 11:21:21.902 Thread-16362 添加类型类 com.mm.rsApp.model.LoginResult 和 cacheKey 的条目登录。 09-07 11:21:21.900 8443-8466/com.mm.rsApp D//RequestProgressManager.java:54: 11:21:21.904 Thread-16362 向现有请求添加请求侦听器时发现请求。 09-07 11:21:21.900 8443-8466/com.mm.rsApp D//RequestProgressManager.java:64: 11:21:21.905 Thread-16362 发送进度 PENDING 09-07 11:21:21.905 8443-8609/com.mm.rsApp D//RequestRunner.java:68: 11:21:21.908 Thread-16369 处理请求:CachedSpiceRequest [requestCacheKey=login, cacheDuration=-1, spiceRequest= com.mm.rsApp.requests.BaseRequest@41d700c0] 09-07 11:21:21.905 8443-8609/com.mm.rsApp D//RequestRunner.java:114: 11:21:21.910 Thread-16369 缓存内容不可用或过期或禁用 09-07 11:21:21.910 8443-8609/com.mm.rsApp D//RequestRunner.java:128: 11:21:21.913 Thread-16369 调用网络请求。 09-07 11:21:21.910 8443-8609/com.mm.rsApp D//RequestProgressManager.java:64: 11:21:21.914 Thread-16369 发送进度 LOADING_FROM_NETWORK 09-07 11:21:21.915 8443-8443/com.mm.rsApp V//DefaultRequestProgressReporter.java:110: 11:21:21.917 main Notifying 1 listeners of progress com.octo.android.robospice.request.listener.RequestProgress @41d71138 09-07 11:21:21.915 8443-8443/com.mm.rsApp V//DefaultRequestProgressReporter.java:110: 11:21:21.921 main Notifying 1 listeners of progress com.octo.android.robospice.request.listener.RequestProgress @41d83c50 09-07 11:21:27.255 8443-8609/com.mm.rsApp D//RequestRunner.java:131: 11:21:27.257 Thread-16369 网络请求调用结束。 09-07 11:21:27.255 8443-8609/com.mm.rsApp D//RequestRunner.java:151: 11:21:27.259 Thread-16369 开始缓存内容... 09-07 11:21:27.260 8443-8609/com.mm.rsApp D//RequestProgressManager.java:64: 11:21:27.262 Thread-16369 发送进度 WRITING_TO_CACHE 09-07 11:21:27.260 8443-8443/com.mm.rsApp V//DefaultRequestProgressReporter.java:110: 11:21:27.265 main Notifying 1 listeners of progress com.octo.android.robospice.request.listener.RequestProgress @41e12c08 09-07 11:21:27.440 8443-8609/com.mm.rsApp I/dalvikvm: threadid=18: 调用 Lcom/google/gson/internal/$Gson$Types;.resolve:LLLL 时堆栈溢出 09-07 11:21:27.440 8443-8609/com.mm.rsApp I/dalvikvm﹕方法需要 96+20+12=128 字节,fp 为 0x5deea348(左 72) 09-07 11:21:27.440 8443-8609/com.mm.rsApp I/dalvikvm﹕扩展堆栈端 (0x5deea300 到 0x5deea000) 09-07 11:21:27.440 8443-8609/com.mm.rsApp I/dalvikvm﹕收缩堆栈(至 0x5deea300,curFrame 为 0x5deeac94) 09-07 11:21:27.480 8443-8609/com.mm.rsApp D//RequestRunner.java:199: 11:21:27.482 Thread-16369 处理请求 CachedSpiceRequest [requestCacheKey=login, cacheDuration=- 1、spiceRequest=com.mm.rsApp.requests.BaseRequest@41d700c0] java.lang.StackOverflowError 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:356) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:141) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) 在 com.google.gson.Gson.getAdapter(Gson.java:359) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access 100 美元(ReflectiveTypeAdapterFactory.java:46) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:92) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) 在 com.google.gson.Gson.getAdapter(Gson.java:359) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access 100 美元(ReflectiveTypeAdapterFactory.java:46) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:92) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) 在 com.google.gson.Gson.getAdapter(Gson.java:359) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access 100 美元(ReflectiveTypeAdapterFactory.java:46) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:92) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) 在 com.google.gson.Gson.getAda
请帮助我了解为什么会出现此错误以及如何解决它
【问题讨论】:
-
Realm 用户已经遇到过类似的问题:github.com/realm/realm-java/issues/696。我可以在 cmets 线程中看到 GSON 配置教程链接。