У меня есть эти классы:AndroidAnnotations: @Rest ошибка преобразования JSon после экспорта
public class OfferList {
public List<Offer> offers;
}
public class Offer {
public String offer_id;
public String group_id;
public String n_hours;
public boolean is_new;
}
И определил эту услугу:
@Rest(rootUrl = "http://MYURL/json", converters = { GsonHttpMessageConverter.class })
//if defined, the url will be added as a prefix to every request
public interface EscolasPertoDeMimRESTService {
@Get("/offers/{user_id}/{date}")
@Accept(MediaType.APPLICATION_JSON)
OfferList getOffers(String user_id, long date);
}
, который называется здесь:
(...)
@RestService
OfferRestService offersService;
(...)
@Background
void loadListItems() {
mLoadingOffers = true;
showProgressDialog();
OfferList ol = null;
try {
ol = offersService.getOffers(myPrefs.userID().get(), myPrefs.lastCheckedForOffers().get());
showDebug("ol.offers.size(): " + ol.offers.size()); //OK shows ol.offers.size(): 24
Offer o = ol.offers.get(0); //After exporting: Crash
showDebug("ol.offers[0].group_id" + o.group_id);
} catch (Exception e) {
showDebug(e.getMessage()); //After exporting shows: "com.google.gson.internal.StringMap cannot be cast to com.humihara.escolaspertodemim.Offer"
}
setupAdapter(ol);
mLoadingOffers = false;
}
(...)
все работает отлично отлаживается, но когда я экспортирую и подписываю, приложение вылетает.
GET отправляется, и ответ с сервера является допустимым списком предложений JSON. Очевидно, результат, который я получаю, - это OfferList с StringMap (s) вместо Предложения (-ов).
Это мой ProGuard-project.txt (я использую Android SDK по умолчанию плюс эти):
-keep public class com.humihara.escolaspertodemim.** { *; }
-keep public class org.springframework.** { *; }
-keep public class com.google.gson.** { *; }
-keep public class com.google.ads.** { *; }
-keep public class com.androidannotations.** { *; }
-keep public class org.acra.** { *; }
-keep public class * extends android.support.v4.app.FragmentActivity
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet); }
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int); }
-dontwarn org.simpleframework.**
-dontnote org.simpleframework.**
-dontwarn org.codehaus.jackson.**
-dontnote org.codehaus.jackson.**
-dontwarn com.fasterxml.jackson.**
-dontnote com.fasterxml.jackson.**
-dontwarn com.google.code.rome.**
-dontnote com.google.code.rome.**
-dontwarn org.apache.commons.httpclient.**
-dontnote org.apache.commons.httpclient.**
Я искал список рассылки плюс StackOverflow, где я взял дополнительные определения для ProGuard, но теперь я не знаю, что еще делать. Может кто-нибудь, пожалуйста, скажите мне, что я должен изменить в своем коде или proguard-project.txt, чтобы заставить его работать?
UPDATE:
После проверки Jackson Json parser returns nulls on all object members on Android after optimizing with Proguard
Я думаю, мне не хватало:
-dontskipnonpubliclibraryclassmembers
андроид ProGuard по умолчанию определяет:
-dontskipnonpubliclibraryclasses
, и я не сделал заметили, t то же выражение.
Я закончил с этим Proguard-project.txt:
-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault
-dontskipnonpubliclibraryclassmembers
-keep class com.humihara.escolaspertodemim.** { *; }
-keep public class * extends android.support.v4.app.FragmentActivity
-dontwarn org.simpleframework.**
-dontnote org.simpleframework.**
-dontwarn org.codehaus.jackson.**
-dontnote org.codehaus.jackson.**
-dontwarn com.fasterxml.jackson.**
-dontnote com.fasterxml.jackson.**
-dontwarn com.google.code.rome.**
-dontnote com.google.code.rome.**
-dontwarn org.apache.commons.httpclient.**
-dontnote org.apache.commons.httpclient.**
А теперь все работает отлично.
Это уже включено в по умолчанию Proguard-android.txt. –
Вы правы, я не заметил, что он находится в конфигурации по умолчанию. Звездочки являются подстановочными знаками, поэтому параметр включает все атрибуты, связанные с аннотацией. Ключом настройки в вашей успешной конфигурации, вероятно, является «-keepattributes Signature». Кажется, что Джексон использует полные общие подписи полей для определения их содержимого. –
С Jackson 2.1.4 Мне нужны были следующие атрибуты: '-keepattributes Signature, EnclosingMethod',' -keepnames class com.fasterxml.jackson. ** {*; } ',' -dontwarn com.fasterxml.jackson.databind. ** ',' -keep public class mydatapackage. ** {*; } ' – ashughes