【问题标题】:AndroidAnnotations: @Rest error converting Json after exportAndroidAnnotations:导出后@Rest错误转换Json
【发布时间】:2013-03-23 02:08:49
【问题描述】:

我有这些课程:

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.**

我已经搜索了邮件列表和 stackoverflow,在那里我找到了 proguard 的额外定义,但现在我不知道还能做什么。 有人可以告诉我我必须在我的代码或 proguard-project.txt 中进行哪些更改才能使其正常工作吗?

更新:

检查后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.**

现在一切正常。

【问题讨论】:

    标签: rest proguard android-annotations


    【解决方案1】:

    对于使用反射访问注解的代码,您应该保留注解:

    -keepattributes *Annotation*
    

    【讨论】:

    • 你说得对,我没有注意到它在默认配置中。星号是通配符,因此该设置包括所有与注释相关的属性。您成功配置的关键设置可能是“-keepattributes Signature”。 Jackson 似乎使用字段的完整通用签名来确定其内容。
    • 对于 Jackson 2.1.4,我需要这些属性:-keepattributes Signature,EnclosingMethod-keepnames class com.fasterxml.jackson.** { *; }-dontwarn com.fasterxml.jackson.databind.**-keep public class mydatapackage.** { *; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    相关资源
    最近更新 更多