jackson-module-kotlin
jackson-module-kotlin copied to clipboard
InvalidDefinitionException: Cannot construct instance
Describe the bug Throws an error when trying to deserialise backend API response with retrofit + httpOk + jackson
To Reproduce kotlin version must be higher than 1.5.31 for example 1.6.10 (newest)
Using minifyEnabled true and proguard with following rules: -keep @com.fasterxml.jackson.annotation.JsonIgnoreProperties class * { ; } -keep @com.fasterxml.jackson.annotation.JsonCreator class * { ; } -keep @com.fasterxml.jackson.annotation.JsonValue class * { ; } -keep class com.fasterxml. { ; } -keep class org.codehaus. { ; } -keepnames class com.fasterxml.jackson.* { *; } -keepclassmembers public final enum com.fasterxml.jackson.annotation.JsonAutoDetect$Visibility { public static final com.fasterxml.jackson.annotation.JsonAutoDetect$Visibility *; }
throws error when deserializing:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of testClass
(no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (okhttp3.e0$a); line: 1, column: 2]
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1904)
at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1349)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1415)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:351)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:184)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)
at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2051)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1459)
at ve.c.a(JacksonResponseBodyConverter.java:33)
Expected behavior Data class getting deserialized from backend response
Versions Kotlin: 1.6.10 Jackson-module-kotlin: 2.13.1 Jackson-databind: 2.13.1 'com.squareup.retrofit2:converter-jackson:2.9.0'
Additional context Works with kotlin versions prior and including 1.5.31 without any other additional changes in configuration or code.
Apparently this is an R8 bug: https://issuetracker.google.com/issues/206855609
Following https://issuetracker.google.com/issues/206855609#comment9 solved the issue.
Apparently this is an R8 bug: https://issuetracker.google.com/issues/206855609
Following https://issuetracker.google.com/issues/206855609#comment9 solved the issue.
This helped a lot, thanks! I'm using r8:3.1.51
It appears to have been resolved and will be closed.
What's the fix for ProGuard (not R8)? I'm using version 2.14.2.