2013-03-23 5 views
0

У меня есть эти классы: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.** 

А теперь все работает отлично.

ответ

1

Для кода, который использует отражение для доступа к аннотациям, вы должны сохранить аннотации:

-keepattributes *Annotation* 
+0

Это уже включено в по умолчанию Proguard-android.txt. –

+1

Вы правы, я не заметил, что он находится в конфигурации по умолчанию. Звездочки являются подстановочными знаками, поэтому параметр включает все атрибуты, связанные с аннотацией. Ключом настройки в вашей успешной конфигурации, вероятно, является «-keepattributes Signature». Кажется, что Джексон использует полные общие подписи полей для определения их содержимого. –

+1

С Jackson 2.1.4 Мне нужны были следующие атрибуты: '-keepattributes Signature, EnclosingMethod',' -keepnames class com.fasterxml.jackson. ** {*; } ',' -dontwarn com.fasterxml.jackson.databind. ** ',' -keep public class mydatapackage. ** {*; } ' – ashughes

Смежные вопросы