2016-03-08 7 views
1

Мое приложение использует Джексон. Я получил минимизирован сборки в основном работает с этой конфигурацией:Jackson + ProGuard: не может десериализовать класс, который использует пользовательский десериализатор

# don't obfuscate Jackson classes 
-keep class com.fasterxml.** { *; } 

# don't strip runtime annotations 
-keepattributes RuntimeVisibleAnnotations 

# keep members with Jackson annotations 
-keepclassmembers public class * { 
    @com.fasterxml.jackson.annotation.JsonCreator *; 
    @com.fasterxml.jackson.annotation.JsonProperty *; 
} 

Но минимизированы строит все еще не десериализовать один класс, который использует пользовательские десериализации, который, в свою очередь, использует фабрику. Завод, десериализатор и картограф производятся Dagger2. Ошибка:

сообщение
com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.mycompany.myapp.c.y]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?) 
      at [Source: N/A; line: -1, column: -1] 
      at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(Unknown Source) 
      at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(Unknown Source) 
      at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(Unknown Source) 
      at com.fasterxml.jackson.databind.ObjectMapper._readValue(Unknown Source) 
      at com.fasterxml.jackson.databind.ObjectMapper.readValue(Unknown Source) 
      at com.fasterxml.jackson.databind.ObjectMapper.treeToValue(Unknown Source) 
      at com.mycompany.myapp.c.x.a(Unknown Source) 
      at com.mycompany.myapp.c.x.a(Unknown Source) 
      at com.mycompany.myapp.c.x.deserialize(Unknown Source) 
      at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(Unknown Source) 
      at com.fasterxml.jackson.databind.ObjectMapper.readValue(Unknown Source) 
      at com.mycompany.myapp.c.ag.d(Unknown Source) 
      at com.mycompany.myapp.c.ag.a(Unknown Source) 
      at com.mycompany.myapp.c.at.run(Unknown Source) 
      at android.os.Handler.handleCallback(Handler.java:605) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4508) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576) 
      at dalvik.system.NativeStart.main(Native Method) 

ошибка говорит о том, что мой класс не имеет конструктор по умолчанию, который на самом деле это делает потому, что экземпляры создаются обычаем десериализатор с помощью фабрики. Это отлично работает, когда я отключу ProGuard. Что мне нужно сделать, чтобы он работал с ProGuard?

ответ

2

я случайно обнаружил этот удобный метод поиска и устранения неисправностей:

-keepnames class * { *; } 

Это показало истинную виновницу быть частным статический вложенный класс внутри моего пользовательского десериализатор. Решение заключалось в том, чтобы удалить public из спецификации класса по этой опции:

-keepclassmembers class * { 
    @com.fasterxml.jackson.annotation.JsonCreator *; 
    @com.fasterxml.jackson.annotation.JsonProperty *; 
} 
Смежные вопросы