jsonmappingexception:没有找到合适的构造函数



我有一个基于android的应用程序,它使用Rest服务连接到谷歌应用程序引擎,该应用程序工作完美,直到它通过ProGuard在发布之前混淆。

运行被混淆的应用程序时,LogCat报告的错误是:

Unable to convert a [application/json,UTF-8] representation into an object of 
  class com.enterprisemk.android.bcw.bincollection.WasteCollectionAreasContainer
org.codehaus.jackson.map.JsonMappingException: No suitable constructor found 
  for type [simple type, class 
  com.enterprisemk.android.bcw.bincollection.WasteCollectionAreasContainer]: 
  can not instantiate from JSON object (need to add/enable type information?)

在我的proguard-project.txt文件中有以下内容:

-keepattributes *Annotation*,EnclosingMethod
-keep public class org.w3c.** {public private protected *;}
-dontwarn org.w3c.**
-keep public class org.joda.time.** {public private protected *;}
-dontwarn org.joda.time.**
-keep public class org.restlet.** { *; }
-dontwarn org.restlet.**
-keep public class org.codehaus.** { *; }
-dontwarn org.codehaus.**
-keepattributes Signature
-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.**

错误指向的类是这样的

public class WasteCollectionAreasContainer {
 public List<WasteCollectionAreas> wasteCollectionAreasList;
 public List<WasteCollectionAreas> getWasteCollectionAreasList() {
     return wasteCollectionAreasList;
 }
 public void setWasteCollectionAreasist(List<WasteCollectionAreas> wasteCollectionAreasList) {
     this.wasteCollectionAreasList = wasteCollectionAreasList;
 }
 public WasteCollectionAreasContainer() {
     wasteCollectionAreasList = new ArrayList<WasteCollectionAreas>();
 }
 @JsonCreator
 public WasteCollectionAreasContainer(List<WasteCollectionAreas> wasteCollectionAreasList) {
     this.wasteCollectionAreasList = wasteCollectionAreasList;
 }
}

在通过ProGuard混淆之前重申一下,应用程序运行完美。
有人能帮我解决这个问题吗?

将以下内容添加到您的Proguard.config。它将帮助您找到问题所在。

-verbose 
-dump class_files.txt 
-printseeds seeds.txt 
-printusage unused.txt 
-printmapping mapping.txt

在我的proguard-project.txt文件

我认为你应该用proguard-android-optimize.txt,而不是proguard-android.txt

完整,感谢Riley Hassell在Android安全讨论中的技巧。

错误信息

org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type
    [simple type, class com.enterprisemk.android.bcw.bincollection.WasteCollectionAreasContainer]:
    can not instantiate from JSON object (need to add/enable type information?)

表明Jackson库正试图使用反射来反序列化您的类,并使用反射的原始名称和带注释的构造函数。ProGuard无法预见到这一点,所以它可能已经删除或重命名了类及其构造函数。您可能需要显式地保存它们:

-keep class com.enterprisemk.android.bcw.bincollection.WasteCollectionAreasContainer {
    <init>(java.util.List);
}

可能还有其他类似的类/字段/方法需要出于同样的原因被保留。

如果其他人也有这个问题,一个更好的解决方案是:

# keep anything annotated with @JsonCreator
-keepclassmembers public class * {
     @com.fasterxml.jackson.annotation.JsonCreator *;
}

用JsonCreator对任何方法进行注释,这在本例中可能是需要的。如果需要加载多个类,则可以避免单独指定每个类。

相关内容

  • 没有找到相关文章

最新更新