我正在使用 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﹕ Enabling debug mode 0 09-07 11:21:04.620 8443-8443/com.mm.rsApp D//SpiceManager.java:1018﹕ 11:21:04.625 main Bound to service : 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 Sending request to service : CachedSpiceRequest 09-07 11:21:21.895 8443-8466/com.mm.rsApp D//RequestProcessor.java:70﹕ 11:21:21.898 Thread-16362 Adding request to queue 1103121632: CachedSpiceRequest [requestCacheKey=login, cacheDuration=-1, spiceRequest=com.mm.rsApp.requests.BaseRequest@41d700c0] size is 0 09-07 11:21:21.900 8443-8466/com.mm.rsApp D//RequestProcessor.java:89﹕ 11:21:21.902 Thread-16362 Adding entry for type class com.mm.rsApp.model.LoginResult and cacheKey login. 09-07 11:21:21.900 8443-8466/com.mm.rsApp D//RequestProgressManager.java:54﹕ 11:21:21.904 Thread-16362 Request was found when adding request listeners to existing requests. 09-07 11:21:21.900 8443-8466/com.mm.rsApp D//RequestProgressManager.java:64﹕ 11:21:21.905 Thread-16362 Sending progress PENDING 09-07 11:21:21.905 8443-8609/com.mm.rsApp D//RequestRunner.java:68﹕ 11:21:21.908 Thread-16369 Processing request : 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 Cache content not available or expired or disabled 09-07 11:21:21.910 8443-8609/com.mm.rsApp D//RequestRunner.java:128﹕ 11:21:21.913 Thread-16369 Calling netwok request. 09-07 11:21:21.910 8443-8609/com.mm.rsApp D//RequestProgressManager.java:64﹕ 11:21:21.914 Thread-16369 Sending progress 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 Network request call ended. 09-07 11:21:27.255 8443-8609/com.mm.rsApp D//RequestRunner.java:151﹕ 11:21:27.259 Thread-16369 Start caching content... 09-07 11:21:27.260 8443-8609/com.mm.rsApp D//RequestProgressManager.java:64﹕ 11:21:27.262 Thread-16369 Sending progress 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: stack overflow on call to Lcom/google/gson/internal/$Gson$Types;.resolve:LLLL 09-07 11:21:27.440 8443-8609/com.mm.rsApp I/dalvikvm﹕ method requires 96+20+12=128 bytes, fp is 0x5deea348 (72 left) 09-07 11:21:27.440 8443-8609/com.mm.rsApp I/dalvikvm﹕ expanding stack end (0x5deea300 to 0x5deea000) 09-07 11:21:27.440 8443-8609/com.mm.rsApp I/dalvikvm﹕ Shrank stack (to 0x5deea300, curFrame is 0x5deeac94) 09-07 11:21:27.480 8443-8609/com.mm.rsApp D//RequestRunner.java:199﹕ 11:21:27.482 Thread-16369 An unexpected error occurred when processsing request CachedSpiceRequest [requestCacheKey=login, cacheDuration=-1, spiceRequest=com.mm.rsApp.requests.BaseRequest@41d700c0] java.lang.StackOverflowError at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:356) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:141) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) at com.google.gson.Gson.getAdapter(Gson.java:359) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:46) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:92) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) at com.google.gson.Gson.getAdapter(Gson.java:359) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:46) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:92) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) at com.google.gson.Gson.getAdapter(Gson.java:359) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:46) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:92) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) at com.google.gson.Gson.getAda
请帮助我知道为什么会出现此错误以及如何解决
最佳答案
我用了Robospice
与 Retrofit
和 Realm
.
我通过覆盖 createConverter()
解决了它在我的Service
扩展类 RetrofitGsonSpiceService
.不幸的是,我不能说得更清楚,因为我没有用过GsonSpringAndroidSpiceService
.
所以在我的Service
类看起来像这样:
@Override
protected Converter createConverter() {
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();
return new GsonConverter(gson);
}
所以想法是找到
Gson
可以使用默认配置进行初始化。这就是为什么我将上述配置传递给 Retrofit
还。new RestAdapter.Builder()
.setConverter(new GsonConverter(gson))
.build();
希望能帮助到你。
关于android - RoboSpice 与 Gson 和 Realm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32434377/