2013-03-23 29 views
0

後轉換的Json我有這些類:AndroidAnnotations:@Rest錯誤出口

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商品列表。 顯然,我得到的結果是一個帶StringMap(s)而不是Offer(s)的OfferList。

這是我的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.** 

我已經搜索郵件列表,以及計算器,我拿起額外的定義,proguard的,但現在我不知道還有什麼要做。 有人可以告訴我什麼我必須改變我的代碼或proguard-project.txt,使其工作?

UPDATE:

檢查Jackson Json parser returns nulls on all object members on Android after optimizing with Proguard

後,我想我是缺少:

-dontskipnonpubliclibraryclassmembers 

默認的Android proguard的定義:

-dontskipnonpubliclibraryclasses 

而我卻沒有注意到他們不是'同樣的表達。

我結束了這個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

對於使用反射來訪問標註的代碼,你應該保留註釋:這是已經包含在默認的ProGuard-android.txt

-keepattributes *Annotation* 
+0

。 – 2013-03-23 23:05:46

+1

你說得對,我沒有注意到它是在默認配置下。星號是通配符,因此該設置包含所有與註釋相關的屬性。成功配置中的關鍵設置可能是「-keepattributes Signature」。傑克遜似乎使用字段的完整通用簽名來確定其內容。 – 2013-03-24 10:36:16

+1

隨着傑克遜2.1.4我需要這些屬性:'-keepattributes Signature,EnclosingMethod','-keepnames class com.fasterxml.jackson。** {*; }','-dontwarn com.fasterxml.jackson.databind。**','-keep public class mydatapackage。** {*; }' – ashughes 2013-03-30 18:12:22