2013-12-08 2 views
1

JsonAnySetter에 대한 질문이 있습니다. 제목에 설명 된대로 proguard을 켤 때 내 JsonAnySetter 핸들러가 호출되지 않습니다. 프로 가드를 끄면 괜찮습니다. 다음은 테스트 코드 및 proguard 설정입니다. 분명히 JsonProperty 주석이 잘 작동하고 있습니다. 그것은 나의 proguard 구성에 의해 삭제되지 않습니다.Proguard를 켜면 JsonAnySetter가 호출되지 않습니다.

public class TestJson 
{ 
    public static class Item1 
    { 
    @JsonAnySetter 
    public void handleUnknown(String key, Object val) 
    { 
    System.out.println(String.format("unknown : %s - %s", key, val.toString())); 
    } 
    @JsonProperty("uid") 
    public long uid_ = 0; 
    public static void test() 
    { 
    ObjectManager m = new ObjectMapper(); 
    m.setVisibilityChecker(....None...) 

    String j1 = "{\"uid\":5, \"pos\":5, \"kk\":888, \"attr\":5}"; 
    Item1 item = (Item1) m.readValue(j1, Item1.class); 
    } 
} 

아래의 라인은 내가 사용한 프로 가드 구성입니다.

-dontobfuscate 
-dontoptimize 
-printusage 
-dontwarn 
-keepattributes *Annotation*,EnclosingMethod,Signature 
-keepnames class com.fasterxml.jackson.** { *; } 
-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class com.android.vending.licensing.ILicensingService 
-keepclasseswithmembernames class * { 
    native <methods>; 
} 
-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 
-keepclasseswithmember class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 
-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 
-keepclassmembers class * { 
    @fully.qualified.package.AnnotationType *; 
} 
-keep public class cca.news.TestJson.** { *; } 

이 문제를 해결할 수있는 사람이 있습니까? proguard와 Jackson의 JsonAnySetter 처리기가 모두 필요합니다.

답변

2

Jackson은 리플렉션을 통해 uid 필드와 handleUnknown 필드에 액세스합니다. ProGuard에서 코드를 분석하여이를 알 수 없다, 그래서 당신은 그들을 보존해야합니다

-keepclassmembers class cca.news.TestJson$Test { 
    public void handleUnknown(java.lang.String, java.lang.Object); 
    public long uid_; 
} 

주 내부 클래스의 $ - 당신은 참으로 모든 종류를 사용할 수 있지만 .와 라인이 일치하지 않습니다 와일드 카드와 패턴.

는 또한 주석을 보존해야합니다

-keep @interface com.fasterxml.jackson.** 

참고 -keep 옵션 - -keepnames와 라인이 충분하지 않을 것이다, 당신은 실제로 단지 모든 클래스를 유지할 수 있지만.

관련 문제